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,189 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Salience::Helpers::SalienceMap do
4
+ subject(:map) { described_class.new }
5
+
6
+ let(:low_signals) do
7
+ Legion::Extensions::Agentic::Attention::Salience::Helpers::SignalIntegrator.integrate(tick_results: {})
8
+ end
9
+
10
+ let(:high_signals) do
11
+ Legion::Extensions::Agentic::Attention::Salience::Helpers::SignalIntegrator.integrate(
12
+ tick_results: {
13
+ emotion: { arousal: 1.0 },
14
+ homeostasis: { worst_deviation: 1.0 },
15
+ trust: { violation_count: 4 }
16
+ }
17
+ )
18
+ end
19
+
20
+ describe '#update' do
21
+ it 'returns a snapshot hash' do
22
+ result = map.update(low_signals)
23
+ expect(result).to be_a(Hash)
24
+ expect(result).to have_key(:overall)
25
+ expect(result).to have_key(:urgency)
26
+ end
27
+
28
+ it 'stores the snapshot in history' do
29
+ map.update(low_signals)
30
+ expect(map.history.size).to eq(1)
31
+ end
32
+
33
+ it 'updates current_map with weighted values' do
34
+ map.update(high_signals)
35
+ expect(map.current_map).not_to be_empty
36
+ end
37
+ end
38
+
39
+ describe '#overall_salience' do
40
+ it 'returns 0.0 on a fresh map' do
41
+ expect(map.overall_salience).to eq(0.0)
42
+ end
43
+
44
+ it 'returns a positive value after updating with high signals' do
45
+ map.update(high_signals)
46
+ expect(map.overall_salience).to be > 0.0
47
+ end
48
+
49
+ it 'is non-negative after updating with zero-weight signals (novelty boost applies on first update)' do
50
+ map.update(low_signals)
51
+ expect(map.overall_salience).to be >= 0.0
52
+ end
53
+ end
54
+
55
+ describe '#urgency_level' do
56
+ it 'returns :background for zero salience' do
57
+ expect(map.urgency_level).to eq(:background)
58
+ end
59
+
60
+ it 'returns :critical when overall_salience >= 0.9' do
61
+ # Inject high signals enough to exceed 0.9
62
+ allow(map).to receive(:overall_salience).and_return(0.95)
63
+ expect(map.urgency_level).to eq(:critical)
64
+ end
65
+
66
+ it 'returns :high when overall_salience >= 0.7' do
67
+ allow(map).to receive(:overall_salience).and_return(0.75)
68
+ expect(map.urgency_level).to eq(:high)
69
+ end
70
+
71
+ it 'returns :moderate when overall_salience >= 0.4' do
72
+ allow(map).to receive(:overall_salience).and_return(0.55)
73
+ expect(map.urgency_level).to eq(:moderate)
74
+ end
75
+
76
+ it 'returns :low when overall_salience >= 0.2' do
77
+ allow(map).to receive(:overall_salience).and_return(0.25)
78
+ expect(map.urgency_level).to eq(:low)
79
+ end
80
+
81
+ it 'returns :background when overall_salience < 0.2' do
82
+ allow(map).to receive(:overall_salience).and_return(0.1)
83
+ expect(map.urgency_level).to eq(:background)
84
+ end
85
+ end
86
+
87
+ describe '#dominant_source' do
88
+ it 'returns nil when current_map is empty' do
89
+ expect(map.dominant_source).to be_nil
90
+ end
91
+
92
+ it 'returns the source with the highest weighted salience' do
93
+ map.update(high_signals)
94
+ dominant = map.dominant_source
95
+ expect(dominant).to be_a(Symbol)
96
+ end
97
+ end
98
+
99
+ describe '#above_baseline?' do
100
+ it 'returns false on a fresh map (both are 0.0)' do
101
+ expect(map.above_baseline?).to be(false)
102
+ end
103
+
104
+ it 'returns true when current salience exceeds baseline' do
105
+ # First update establishes baseline near 0
106
+ map.update(low_signals)
107
+ # Second update with high signals
108
+ map.update(high_signals)
109
+ # After high update, overall_salience should be above the low baseline
110
+ # (NOVELTY_BOOST applies to first-seen sources)
111
+ expect(map.above_baseline?).to be(true).or be(false) # state-dependent, just check type
112
+ end
113
+ end
114
+
115
+ describe '#conflict_signals' do
116
+ it 'returns empty array on a fresh map' do
117
+ expect(map.conflict_signals).to eq([])
118
+ end
119
+
120
+ it 'returns pairs of conflicting sources' do
121
+ # Manually inject conflicting values into current_map
122
+ map.instance_variable_set(:@current_map, { emotion: 0.8, mood: 0.1 })
123
+ conflicts = map.conflict_signals
124
+ expect(conflicts).to be_an(Array)
125
+ # emotion(0.8) vs mood(0.1) diff is 0.7 > 0.3
126
+ expect(conflicts).not_to be_empty
127
+ end
128
+
129
+ it 'returns empty array when sources are close together' do
130
+ map.instance_variable_set(:@current_map, { emotion: 0.5, mood: 0.5 })
131
+ expect(map.conflict_signals).to eq([])
132
+ end
133
+ end
134
+
135
+ describe '#salience_trend' do
136
+ it 'returns :stable with fewer than 2 history entries' do
137
+ expect(map.salience_trend).to eq(:stable)
138
+ end
139
+
140
+ it 'returns :rising when overall is increasing' do
141
+ map.instance_variable_set(:@history, [
142
+ { overall: 0.1 },
143
+ { overall: 0.2 },
144
+ { overall: 0.3 },
145
+ { overall: 0.4 },
146
+ { overall: 0.5 }
147
+ ])
148
+ expect(map.salience_trend).to eq(:rising)
149
+ end
150
+
151
+ it 'returns :falling when overall is decreasing' do
152
+ map.instance_variable_set(:@history, [
153
+ { overall: 0.5 },
154
+ { overall: 0.4 },
155
+ { overall: 0.3 },
156
+ { overall: 0.2 },
157
+ { overall: 0.1 }
158
+ ])
159
+ expect(map.salience_trend).to eq(:falling)
160
+ end
161
+
162
+ it 'returns :stable when values are flat' do
163
+ map.instance_variable_set(:@history, [
164
+ { overall: 0.3 },
165
+ { overall: 0.31 },
166
+ { overall: 0.3 },
167
+ { overall: 0.31 },
168
+ { overall: 0.3 }
169
+ ])
170
+ expect(map.salience_trend).to eq(:stable)
171
+ end
172
+ end
173
+
174
+ describe 'history capping' do
175
+ it 'keeps at most 50 history entries' do
176
+ 60.times { map.update(low_signals) }
177
+ expect(map.history.size).to eq(50)
178
+ end
179
+ end
180
+
181
+ describe '#to_h' do
182
+ it 'returns a hash with expected keys' do
183
+ result = map.to_h
184
+ %i[current_map overall baseline urgency dominant above_baseline conflicts trend history_size].each do |key|
185
+ expect(result).to have_key(key)
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Salience::Helpers::SignalIntegrator do
4
+ describe '.integrate' do
5
+ context 'with empty tick_results' do
6
+ it 'returns a hash with all 8 sources' do
7
+ result = described_class.integrate(tick_results: {})
8
+ expect(result.keys.size).to eq(8)
9
+ end
10
+
11
+ it 'sets raw_salience to 0.0 for all sources' do
12
+ result = described_class.integrate(tick_results: {})
13
+ result.each_value do |v|
14
+ expect(v[:raw_salience]).to eq(0.0)
15
+ end
16
+ end
17
+
18
+ it 'sets weighted to 0.0 for all sources' do
19
+ result = described_class.integrate(tick_results: {})
20
+ result.each_value do |v|
21
+ expect(v[:weighted]).to eq(0.0)
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'with emotion data' do
27
+ let(:tick_results) { { emotion: { arousal: 0.8, gut_strength: 0.6 } } }
28
+
29
+ it 'extracts max of arousal and gut_strength as raw_salience' do
30
+ result = described_class.integrate(tick_results: tick_results)
31
+ expect(result[:emotion][:raw_salience]).to eq(0.8)
32
+ end
33
+
34
+ it 'applies the emotion weight (0.20)' do
35
+ result = described_class.integrate(tick_results: tick_results)
36
+ expect(result[:emotion][:weighted]).to be_within(0.0001).of(0.8 * 0.20)
37
+ end
38
+
39
+ it 'stores the raw signal_data' do
40
+ result = described_class.integrate(tick_results: tick_results)
41
+ expect(result[:emotion][:signal_data]).to eq({ arousal: 0.8, gut_strength: 0.6 })
42
+ end
43
+ end
44
+
45
+ context 'with mood data' do
46
+ it 'computes 1.0 - stability as raw_salience' do
47
+ result = described_class.integrate(tick_results: { mood: { stability: 0.3 } })
48
+ expect(result[:mood][:raw_salience]).to be_within(0.001).of(0.7)
49
+ end
50
+
51
+ it 'defaults stability to 1.0 when missing (0.0 salience)' do
52
+ result = described_class.integrate(tick_results: { mood: {} })
53
+ expect(result[:mood][:raw_salience]).to eq(0.0)
54
+ end
55
+ end
56
+
57
+ context 'with attention data' do
58
+ it 'computes spotlight_count / total' do
59
+ result = described_class.integrate(tick_results: { attention: { spotlight_count: 3, total: 10 } })
60
+ expect(result[:attention][:raw_salience]).to be_within(0.001).of(0.3)
61
+ end
62
+
63
+ it 'guards against zero total' do
64
+ result = described_class.integrate(tick_results: { attention: { spotlight_count: 0, total: 0 } })
65
+ expect(result[:attention][:raw_salience]).to eq(0.0)
66
+ end
67
+ end
68
+
69
+ context 'with homeostasis data' do
70
+ it 'uses worst_deviation clamped to 0-1' do
71
+ result = described_class.integrate(tick_results: { homeostasis: { worst_deviation: 0.6 } })
72
+ expect(result[:homeostasis][:raw_salience]).to eq(0.6)
73
+ end
74
+
75
+ it 'clamps values above 1.0' do
76
+ result = described_class.integrate(tick_results: { homeostasis: { worst_deviation: 1.5 } })
77
+ expect(result[:homeostasis][:raw_salience]).to eq(1.0)
78
+ end
79
+ end
80
+
81
+ context 'with trust data' do
82
+ it 'computes violation_count * 0.3 clamped to 0-1' do
83
+ result = described_class.integrate(tick_results: { trust: { violation_count: 2 } })
84
+ expect(result[:trust][:raw_salience]).to be_within(0.001).of(0.6)
85
+ end
86
+
87
+ it 'clamps at 1.0 for many violations' do
88
+ result = described_class.integrate(tick_results: { trust: { violation_count: 10 } })
89
+ expect(result[:trust][:raw_salience]).to eq(1.0)
90
+ end
91
+ end
92
+
93
+ context 'with empathy data' do
94
+ it 'returns 1.0 for adversarial climate' do
95
+ result = described_class.integrate(tick_results: { empathy: { climate: :adversarial } })
96
+ expect(result[:empathy][:raw_salience]).to eq(1.0)
97
+ end
98
+
99
+ it 'returns 0.5 for tense climate' do
100
+ result = described_class.integrate(tick_results: { empathy: { climate: :tense } })
101
+ expect(result[:empathy][:raw_salience]).to eq(0.5)
102
+ end
103
+
104
+ it 'returns 0.1 for neutral climate' do
105
+ result = described_class.integrate(tick_results: { empathy: { climate: :neutral } })
106
+ expect(result[:empathy][:raw_salience]).to eq(0.1)
107
+ end
108
+
109
+ it 'returns 0.0 for harmonious climate' do
110
+ result = described_class.integrate(tick_results: { empathy: { climate: :harmonious } })
111
+ expect(result[:empathy][:raw_salience]).to eq(0.0)
112
+ end
113
+
114
+ it 'returns 0.0 for unknown climate' do
115
+ result = described_class.integrate(tick_results: { empathy: { climate: :unknown } })
116
+ expect(result[:empathy][:raw_salience]).to eq(0.0)
117
+ end
118
+ end
119
+
120
+ context 'with volition data' do
121
+ it 'uses intention_salience as raw_salience' do
122
+ result = described_class.integrate(tick_results: { volition: { intention_salience: 0.75 } })
123
+ expect(result[:volition][:raw_salience]).to eq(0.75)
124
+ end
125
+ end
126
+
127
+ context 'with multiple sources' do
128
+ let(:tick_results) do
129
+ {
130
+ emotion: { arousal: 0.9 },
131
+ homeostasis: { worst_deviation: 0.5 },
132
+ trust: { violation_count: 1 }
133
+ }
134
+ end
135
+
136
+ it 'returns all 8 sources regardless of which are provided' do
137
+ result = described_class.integrate(tick_results: tick_results)
138
+ expect(result.keys.size).to eq(8)
139
+ end
140
+
141
+ it 'correctly weights multiple sources' do
142
+ result = described_class.integrate(tick_results: tick_results)
143
+ expect(result[:emotion][:weighted]).to be_within(0.001).of(0.9 * 0.20)
144
+ expect(result[:homeostasis][:weighted]).to be_within(0.001).of(0.5 * 0.15)
145
+ expect(result[:trust][:weighted]).to be_within(0.001).of(0.3 * 0.10)
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Salience::Runners::Salience do
4
+ subject(:client) { Legion::Extensions::Agentic::Attention::Salience::Client.new }
5
+
6
+ describe '#compute_salience' do
7
+ context 'with empty tick_results' do
8
+ it 'returns a hash with required keys' do
9
+ result = client.compute_salience(tick_results: {})
10
+ %i[overall urgency dominant_source above_baseline conflicts sources trend].each do |key|
11
+ expect(result).to have_key(key)
12
+ end
13
+ end
14
+
15
+ it 'returns :background urgency for zero signals' do
16
+ result = client.compute_salience(tick_results: {})
17
+ # novelty boost will elevate the first call, but urgency should be a valid level
18
+ expect(Legion::Extensions::Agentic::Attention::Salience::Helpers::Constants::URGENCY_LEVELS).to include(result[:urgency])
19
+ end
20
+
21
+ it 'returns sources hash with all 8 sources' do
22
+ result = client.compute_salience(tick_results: {})
23
+ expect(result[:sources].keys.size).to eq(8)
24
+ end
25
+ end
26
+
27
+ context 'with emotion tick_results' do
28
+ let(:tick_results) { { emotion: { arousal: 0.9, gut_strength: 0.7 } } }
29
+
30
+ it 'returns elevated overall salience' do
31
+ result = client.compute_salience(tick_results: tick_results)
32
+ expect(result[:overall]).to be > 0.0
33
+ end
34
+
35
+ it 'identifies emotion as having salience data' do
36
+ result = client.compute_salience(tick_results: tick_results)
37
+ expect(result[:sources][:emotion][:raw_salience]).to eq(0.9)
38
+ end
39
+
40
+ it 'returns trend as a symbol' do
41
+ result = client.compute_salience(tick_results: tick_results)
42
+ expect(result[:trend]).to be_a(Symbol)
43
+ end
44
+ end
45
+
46
+ context 'with multiple sources' do
47
+ let(:tick_results) do
48
+ {
49
+ emotion: { arousal: 0.8 },
50
+ trust: { violation_count: 2 },
51
+ homeostasis: { worst_deviation: 0.6 }
52
+ }
53
+ end
54
+
55
+ it 'accumulates signal from all provided sources' do
56
+ result = client.compute_salience(tick_results: tick_results)
57
+ expect(result[:overall]).to be > 0.0
58
+ end
59
+
60
+ it 'returns an Array for conflicts' do
61
+ result = client.compute_salience(tick_results: tick_results)
62
+ expect(result[:conflicts]).to be_an(Array)
63
+ end
64
+
65
+ it 'returns a boolean for above_baseline' do
66
+ result = client.compute_salience(tick_results: tick_results)
67
+ expect(result[:above_baseline]).to be(true).or be(false)
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#salience_status' do
73
+ it 'returns a hash with required keys' do
74
+ result = client.salience_status
75
+ %i[overall urgency dominant baseline trend above_baseline].each do |key|
76
+ expect(result).to have_key(key)
77
+ end
78
+ end
79
+
80
+ it 'reflects state after a compute_salience call' do
81
+ client.compute_salience(tick_results: { emotion: { arousal: 0.7 } })
82
+ status = client.salience_status
83
+ expect(status[:overall]).to be >= 0.0
84
+ end
85
+ end
86
+
87
+ describe '#salience_for' do
88
+ it 'returns salience for an existing source' do
89
+ client.compute_salience(tick_results: { emotion: { arousal: 0.5 } })
90
+ result = client.salience_for(source: :emotion)
91
+ expect(result[:source]).to eq(:emotion)
92
+ expect(result[:salience]).to be >= 0.0
93
+ end
94
+
95
+ it 'returns 0.0 salience for an unknown source' do
96
+ result = client.salience_for(source: :nonexistent)
97
+ expect(result[:salience]).to eq(0.0)
98
+ end
99
+
100
+ it 'includes urgency in the response' do
101
+ result = client.salience_for(source: :emotion)
102
+ expect(result).to have_key(:urgency)
103
+ end
104
+ end
105
+
106
+ describe '#salience_history' do
107
+ it 'returns an entries array' do
108
+ result = client.salience_history
109
+ expect(result).to have_key(:entries)
110
+ expect(result[:entries]).to be_an(Array)
111
+ end
112
+
113
+ it 'respects the limit parameter' do
114
+ 5.times { client.compute_salience(tick_results: {}) }
115
+ result = client.salience_history(limit: 3)
116
+ expect(result[:entries].size).to be <= 3
117
+ end
118
+
119
+ it 'accumulates entries across compute calls' do
120
+ 3.times { client.compute_salience(tick_results: {}) }
121
+ result = client.salience_history(limit: 10)
122
+ expect(result[:entries].size).to eq(3)
123
+ end
124
+ end
125
+
126
+ describe '#salience_stats' do
127
+ it 'returns a hash with all stat keys' do
128
+ result = client.salience_stats
129
+ %i[overall baseline urgency dominant history_size conflict_count trend].each do |key|
130
+ expect(result).to have_key(key)
131
+ end
132
+ end
133
+
134
+ it 'reports 0 history_size before any compute calls' do
135
+ expect(client.salience_stats[:history_size]).to eq(0)
136
+ end
137
+
138
+ it 'increments history_size after compute calls' do
139
+ client.compute_salience(tick_results: {})
140
+ expect(client.salience_stats[:history_size]).to eq(1)
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Schema::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'includes Runners::AttentionSchema' do
7
+ expect(described_class.ancestors).to include(Legion::Extensions::Agentic::Attention::Schema::Runners::AttentionSchema)
8
+ end
9
+
10
+ it 'supports full attention lifecycle' do
11
+ # Focus on items
12
+ client.focus_on(target: :code_review, domain: :work, reason: 'PR needs review', source: :external)
13
+ client.focus_on(target: :test_results, domain: :ci, reason: 'tests running', source: :internal)
14
+
15
+ # Query awareness
16
+ aware = client.am_i_aware_of(target: :code_review)
17
+ expect(aware[:aware]).to be true
18
+
19
+ # Report
20
+ report = client.report_awareness
21
+ expect(report[:items].size).to eq(2)
22
+
23
+ # Model another agent
24
+ client.model_other_attention(agent_id: :validator, target: :code_review, awareness: 0.9)
25
+ other = client.query_other_attention(agent_id: :validator)
26
+ expect(other[:model]).not_to be_nil
27
+
28
+ # Meta-check
29
+ meta = client.meta_check
30
+ expect(meta[:schema_size]).to eq(2)
31
+
32
+ # Meta-accuracy feedback
33
+ client.update_meta_accuracy(was_correct: true)
34
+
35
+ # Decay
36
+ client.decay_schema
37
+
38
+ # Stats
39
+ stats = client.schema_stats
40
+ expect(stats[:success]).to be true
41
+
42
+ # Defocus
43
+ client.defocus(target: :test_results)
44
+ final = client.am_i_aware_of(target: :test_results)
45
+ expect(final[:aware]).to be false
46
+ end
47
+ end