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,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Arousal::Helpers::ArousalModel do
4
+ let(:model) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'starts at the default arousal level' do
8
+ expect(model.arousal).to be_within(0.001).of(Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants::DEFAULT_AROUSAL)
9
+ end
10
+
11
+ it 'starts with empty history' do
12
+ expect(model.arousal_history).to be_empty
13
+ end
14
+
15
+ it 'starts with zero performance' do
16
+ expect(model.performance_last).to eq(0.0)
17
+ end
18
+ end
19
+
20
+ describe '#stimulate' do
21
+ it 'increases arousal' do
22
+ before = model.arousal
23
+ model.stimulate(amount: 0.3, source: :test)
24
+ expect(model.arousal).to be > before
25
+ end
26
+
27
+ it 'records the source in history' do
28
+ model.stimulate(amount: 0.2, source: :external)
29
+ expect(model.arousal_history.last[:source]).to eq(:external)
30
+ end
31
+
32
+ it 'clamps arousal at ceiling' do
33
+ 10.times { model.stimulate(amount: 1.0, source: :test) }
34
+ expect(model.arousal).to be <= 1.0
35
+ end
36
+
37
+ it 'returns the new arousal level' do
38
+ result = model.stimulate(amount: 0.2, source: :test)
39
+ expect(result).to eq(model.arousal)
40
+ end
41
+ end
42
+
43
+ describe '#calm' do
44
+ before { model.stimulate(amount: 0.5, source: :setup) }
45
+
46
+ it 'decreases arousal' do
47
+ before = model.arousal
48
+ model.calm(amount: 0.2)
49
+ expect(model.arousal).to be < before
50
+ end
51
+
52
+ it 'clamps arousal at floor' do
53
+ 10.times { model.calm(amount: 1.0) }
54
+ expect(model.arousal).to be >= 0.0
55
+ end
56
+
57
+ it 'returns the new arousal level' do
58
+ result = model.calm(amount: 0.1)
59
+ expect(result).to eq(model.arousal)
60
+ end
61
+ end
62
+
63
+ describe '#decay' do
64
+ it 'moves arousal toward the default resting level from above' do
65
+ model.stimulate(amount: 0.5, source: :setup)
66
+ raised = model.arousal
67
+ model.decay
68
+ # After stimulating above default, decay should lower it (move toward default)
69
+ expect(model.arousal).to be < raised
70
+ end
71
+
72
+ it 'records a decay entry in history' do
73
+ model.decay
74
+ expect(model.arousal_history.last[:source]).to eq(:decay)
75
+ end
76
+ end
77
+
78
+ describe '#performance' do
79
+ it 'returns a value between 0 and 1' do
80
+ perf = model.performance
81
+ expect(perf).to be >= 0.0
82
+ expect(perf).to be <= 1.0
83
+ end
84
+
85
+ it 'returns highest performance near the optimal arousal' do
86
+ model.stimulate(amount: 0.2, source: :test)
87
+ perf_near_optimal = model.performance(task_complexity: :moderate)
88
+
89
+ model2 = described_class.new
90
+ 10.times { model2.stimulate(amount: 0.8, source: :test) }
91
+ perf_far_from_optimal = model2.performance(task_complexity: :moderate)
92
+
93
+ expect(perf_near_optimal).to be >= perf_far_from_optimal
94
+ end
95
+
96
+ it 'uses complexity-specific optimal for simple tasks' do
97
+ perf_simple = model.performance(task_complexity: :simple)
98
+ expect(perf_simple).to be_a(Float)
99
+ end
100
+
101
+ it 'updates performance_last' do
102
+ model.performance(task_complexity: :moderate)
103
+ expect(model.performance_last).to be > 0.0
104
+ end
105
+ end
106
+
107
+ describe '#arousal_label' do
108
+ it 'returns :dormant for near-zero arousal' do
109
+ 10.times { model.calm(amount: 1.0) }
110
+ expect(model.arousal_label).to eq(:dormant)
111
+ end
112
+
113
+ it 'returns :panic for high arousal' do
114
+ 10.times { model.stimulate(amount: 1.0, source: :test) }
115
+ expect(model.arousal_label).to eq(:panic)
116
+ end
117
+
118
+ it 'returns a symbol for any arousal level' do
119
+ expect(model.arousal_label).to be_a(Symbol)
120
+ end
121
+ end
122
+
123
+ describe '#optimal_for' do
124
+ it 'returns the correct optimal for each complexity' do
125
+ constants = Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants
126
+ expect(model.optimal_for(:trivial)).to eq(constants::TASK_COMPLEXITIES[:trivial])
127
+ expect(model.optimal_for(:moderate)).to eq(constants::TASK_COMPLEXITIES[:moderate])
128
+ expect(model.optimal_for(:extreme)).to eq(constants::TASK_COMPLEXITIES[:extreme])
129
+ end
130
+
131
+ it 'returns the default when complexity is unknown' do
132
+ expect(model.optimal_for(:unknown)).to eq(Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants::OPTIMAL_AROUSAL_DEFAULT)
133
+ end
134
+ end
135
+
136
+ describe '#arousal_history cap' do
137
+ it 'does not exceed MAX_AROUSAL_HISTORY entries' do
138
+ max = Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants::MAX_AROUSAL_HISTORY
139
+ (max + 10).times { model.stimulate(amount: 0.01, source: :test) }
140
+ expect(model.arousal_history.size).to eq(max)
141
+ end
142
+ end
143
+
144
+ describe '#to_h' do
145
+ it 'includes arousal, label, performance_last, and history_size' do
146
+ h = model.to_h
147
+ expect(h).to have_key(:arousal)
148
+ expect(h).to have_key(:label)
149
+ expect(h).to have_key(:performance_last)
150
+ expect(h).to have_key(:history_size)
151
+ end
152
+
153
+ it 'reflects the current state' do
154
+ model.stimulate(amount: 0.2, source: :test)
155
+ h = model.to_h
156
+ expect(h[:arousal]).to eq(model.arousal)
157
+ expect(h[:history_size]).to eq(model.arousal_history.size)
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants do
4
+ describe 'DEFAULT_AROUSAL' do
5
+ it 'is 0.3' do
6
+ expect(described_class::DEFAULT_AROUSAL).to eq(0.3)
7
+ end
8
+ end
9
+
10
+ describe 'AROUSAL_FLOOR and AROUSAL_CEILING' do
11
+ it 'floor is 0.0' do
12
+ expect(described_class::AROUSAL_FLOOR).to eq(0.0)
13
+ end
14
+
15
+ it 'ceiling is 1.0' do
16
+ expect(described_class::AROUSAL_CEILING).to eq(1.0)
17
+ end
18
+ end
19
+
20
+ describe 'TASK_COMPLEXITIES' do
21
+ it 'includes all expected complexity levels' do
22
+ expect(described_class::TASK_COMPLEXITIES.keys).to contain_exactly(:trivial, :simple, :moderate, :complex, :extreme)
23
+ end
24
+
25
+ it 'trivial has the highest optimal arousal' do
26
+ expect(described_class::TASK_COMPLEXITIES[:trivial]).to be > described_class::TASK_COMPLEXITIES[:extreme]
27
+ end
28
+
29
+ it 'extreme has the lowest optimal arousal' do
30
+ expect(described_class::TASK_COMPLEXITIES[:extreme]).to eq(0.3)
31
+ end
32
+ end
33
+
34
+ describe 'AROUSAL_LABELS' do
35
+ it 'covers the full 0.0..1.0 range' do
36
+ test_values = [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
37
+ test_values.each do |v|
38
+ matched = described_class::AROUSAL_LABELS.any? { |range, _| range.cover?(v) }
39
+ expect(matched).to be(true), "Expected #{v} to match a label range"
40
+ end
41
+ end
42
+
43
+ it 'maps values >= 0.8 to :panic' do
44
+ range, label = described_class::AROUSAL_LABELS.find { |r, _| r.cover?(0.9) }
45
+ expect(label).to eq(:panic)
46
+ expect(range).to cover(0.9)
47
+ end
48
+
49
+ it 'maps values in 0.4..0.6 to :optimal' do
50
+ range, label = described_class::AROUSAL_LABELS.find { |r, _| r.cover?(0.5) }
51
+ expect(label).to eq(:optimal)
52
+ expect(range).to cover(0.5)
53
+ end
54
+ end
55
+
56
+ describe 'OPTIMAL_AROUSAL_SIMPLE and OPTIMAL_AROUSAL_COMPLEX' do
57
+ it 'simple optimal is higher than complex optimal' do
58
+ expect(described_class::OPTIMAL_AROUSAL_SIMPLE).to be > described_class::OPTIMAL_AROUSAL_COMPLEX
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/arousal/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Arousal::Runners::Arousal do
6
+ let(:client) { Legion::Extensions::Agentic::Attention::Arousal::Client.new }
7
+
8
+ describe '#stimulate' do
9
+ it 'returns success: true' do
10
+ result = client.stimulate
11
+ expect(result[:success]).to be(true)
12
+ end
13
+
14
+ it 'returns the new arousal level' do
15
+ result = client.stimulate(amount: 0.2, source: :test)
16
+ expect(result[:arousal]).to be_a(Float)
17
+ end
18
+
19
+ it 'returns a label' do
20
+ result = client.stimulate
21
+ expect(result[:label]).to be_a(Symbol)
22
+ end
23
+
24
+ it 'returns the source' do
25
+ result = client.stimulate(source: :external_event)
26
+ expect(result[:source]).to eq(:external_event)
27
+ end
28
+
29
+ it 'increases arousal above default' do
30
+ result = client.stimulate(amount: 0.4)
31
+ expect(result[:arousal]).to be > Legion::Extensions::Agentic::Attention::Arousal::Helpers::Constants::DEFAULT_AROUSAL
32
+ end
33
+ end
34
+
35
+ describe '#calm' do
36
+ before { client.stimulate(amount: 0.5) }
37
+
38
+ it 'returns success: true' do
39
+ expect(client.calm[:success]).to be(true)
40
+ end
41
+
42
+ it 'returns the new arousal level' do
43
+ result = client.calm(amount: 0.1)
44
+ expect(result[:arousal]).to be_a(Float)
45
+ end
46
+
47
+ it 'returns a label' do
48
+ expect(client.calm[:label]).to be_a(Symbol)
49
+ end
50
+ end
51
+
52
+ describe '#update_arousal' do
53
+ it 'returns success: true' do
54
+ expect(client.update_arousal[:success]).to be(true)
55
+ end
56
+
57
+ it 'returns arousal, label, and performance' do
58
+ result = client.update_arousal
59
+ expect(result).to have_key(:arousal)
60
+ expect(result).to have_key(:label)
61
+ expect(result).to have_key(:performance)
62
+ end
63
+
64
+ it 'returns performance between 0 and 1' do
65
+ result = client.update_arousal
66
+ expect(result[:performance]).to be_between(0.0, 1.0)
67
+ end
68
+ end
69
+
70
+ describe '#check_performance' do
71
+ it 'returns success: true' do
72
+ expect(client.check_performance[:success]).to be(true)
73
+ end
74
+
75
+ it 'returns performance, arousal, optimal_arousal, and task_complexity' do
76
+ result = client.check_performance(task_complexity: :simple)
77
+ expect(result).to have_key(:performance)
78
+ expect(result).to have_key(:arousal)
79
+ expect(result).to have_key(:optimal_arousal)
80
+ expect(result[:task_complexity]).to eq(:simple)
81
+ end
82
+
83
+ it 'reflects the optimal arousal for the given complexity' do
84
+ result_simple = client.check_performance(task_complexity: :simple)
85
+ result_extreme = client.check_performance(task_complexity: :extreme)
86
+ expect(result_simple[:optimal_arousal]).to be > result_extreme[:optimal_arousal]
87
+ end
88
+ end
89
+
90
+ describe '#arousal_status' do
91
+ it 'returns success: true' do
92
+ expect(client.arousal_status[:success]).to be(true)
93
+ end
94
+
95
+ it 'returns arousal, label, performance, and history_size' do
96
+ result = client.arousal_status
97
+ expect(result).to have_key(:arousal)
98
+ expect(result).to have_key(:label)
99
+ expect(result).to have_key(:performance)
100
+ expect(result).to have_key(:history_size)
101
+ end
102
+ end
103
+
104
+ describe '#arousal_guidance' do
105
+ it 'returns success: true' do
106
+ expect(client.arousal_guidance[:success]).to be(true)
107
+ end
108
+
109
+ it 'returns guidance as a symbol' do
110
+ result = client.arousal_guidance
111
+ expect(result[:guidance]).to be_a(Symbol)
112
+ end
113
+
114
+ it 'returns :throttle when arousal is well above optimal' do
115
+ 5.times { client.stimulate(amount: 1.0) }
116
+ result = client.arousal_guidance(task_complexity: :extreme)
117
+ expect(result[:guidance]).to eq(:throttle)
118
+ end
119
+
120
+ it 'returns :boost when arousal is well below optimal' do
121
+ 10.times { client.calm(amount: 1.0) }
122
+ result = client.arousal_guidance(task_complexity: :trivial)
123
+ expect(result[:guidance]).to eq(:boost)
124
+ end
125
+
126
+ it 'returns :maintain when near optimal' do
127
+ result = client.arousal_guidance(task_complexity: :moderate)
128
+ expect(%i[maintain throttle boost]).to include(result[:guidance])
129
+ end
130
+
131
+ it 'includes optimal_arousal and task_complexity' do
132
+ result = client.arousal_guidance(task_complexity: :complex)
133
+ expect(result[:optimal_arousal]).to eq(0.4)
134
+ expect(result[:task_complexity]).to eq(:complex)
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Blindspot::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'includes the runner module' do
7
+ expect(client).to respond_to(:register_blindspot)
8
+ end
9
+
10
+ it 'provides a BlindspotEngine' do
11
+ expect(client.engine).to be_a(
12
+ Legion::Extensions::Agentic::Attention::Blindspot::Helpers::BlindspotEngine
13
+ )
14
+ end
15
+
16
+ it 'registers and acknowledges a blindspot' do
17
+ result = client.register_blindspot(
18
+ domain: :logic,
19
+ discovered_by: :self_reflection,
20
+ description: 'Underestimates rare events'
21
+ )
22
+ expect(result[:success]).to be true
23
+
24
+ ack = client.acknowledge_blindspot(blindspot_id: result[:id])
25
+ expect(ack[:success]).to be true
26
+ expect(ack[:status]).to eq(:acknowledged)
27
+ end
28
+
29
+ it 'full lifecycle: register -> mitigate -> resolve' do
30
+ reg = client.register_blindspot(domain: :planning, discovered_by: :peer_feedback,
31
+ description: 'Overestimates available time')
32
+ client.mitigate_blindspot(blindspot_id: reg[:id])
33
+ res = client.resolve_blindspot(blindspot_id: reg[:id])
34
+ expect(res[:status]).to eq(:resolved)
35
+ end
36
+
37
+ it 'awareness score is 1.0 with no blindspots' do
38
+ report = client.awareness_score_report
39
+ expect(report[:awareness_score]).to eq(1.0)
40
+ end
41
+ end
@@ -0,0 +1,246 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Blindspot::Helpers::BlindspotEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:blindspot) do
7
+ engine.register_blindspot(
8
+ domain: :reasoning,
9
+ discovered_by: :error_analysis,
10
+ description: 'Confirmation bias in evidence weighing'
11
+ )
12
+ end
13
+
14
+ describe '#initialize' do
15
+ it 'starts with awareness_score of 1.0' do
16
+ expect(engine.awareness_score).to eq(1.0)
17
+ end
18
+ end
19
+
20
+ describe '#register_blindspot' do
21
+ it 'returns a Blindspot object' do
22
+ expect(blindspot).to be_a(Legion::Extensions::Agentic::Attention::Blindspot::Helpers::Blindspot)
23
+ end
24
+
25
+ it 'assigns a uuid' do
26
+ expect(blindspot.id).to match(/\A[0-9a-f-]{36}\z/)
27
+ end
28
+
29
+ it 'recalculates awareness score after registration' do
30
+ blindspot
31
+ expect(engine.awareness_score).to be < 1.0
32
+ end
33
+ end
34
+
35
+ describe '#acknowledge_blindspot' do
36
+ it 'returns found: false for unknown id' do
37
+ result = engine.acknowledge_blindspot(blindspot_id: 'bad-id')
38
+ expect(result[:found]).to be false
39
+ end
40
+
41
+ it 'acknowledges a known blindspot' do
42
+ result = engine.acknowledge_blindspot(blindspot_id: blindspot.id)
43
+ expect(result[:found]).to be true
44
+ expect(result[:status]).to eq(:acknowledged)
45
+ end
46
+
47
+ it 'updates awareness score after acknowledging' do
48
+ engine.acknowledge_blindspot(blindspot_id: blindspot.id)
49
+ expect(engine.awareness_score).to eq(1.0)
50
+ end
51
+ end
52
+
53
+ describe '#mitigate_blindspot' do
54
+ it 'returns found: false for unknown id' do
55
+ result = engine.mitigate_blindspot(blindspot_id: 'bad-id')
56
+ expect(result[:found]).to be false
57
+ end
58
+
59
+ it 'mitigates a known blindspot' do
60
+ result = engine.mitigate_blindspot(blindspot_id: blindspot.id)
61
+ expect(result[:found]).to be true
62
+ expect(result[:status]).to eq(:mitigated)
63
+ end
64
+
65
+ it 'reduces severity on mitigation' do
66
+ before = blindspot.severity
67
+ engine.mitigate_blindspot(blindspot_id: blindspot.id)
68
+ expect(blindspot.severity).to be < before
69
+ end
70
+ end
71
+
72
+ describe '#resolve_blindspot' do
73
+ it 'returns found: false for unknown id' do
74
+ result = engine.resolve_blindspot(blindspot_id: 'bad-id')
75
+ expect(result[:found]).to be false
76
+ end
77
+
78
+ it 'resolves a known blindspot' do
79
+ result = engine.resolve_blindspot(blindspot_id: blindspot.id)
80
+ expect(result[:found]).to be true
81
+ expect(result[:status]).to eq(:resolved)
82
+ end
83
+ end
84
+
85
+ describe '#set_boundary' do
86
+ it 'creates a new boundary' do
87
+ b = engine.set_boundary(domain: :math, confidence: 0.8, coverage_estimate: 0.6)
88
+ expect(b).to be_a(Legion::Extensions::Agentic::Attention::Blindspot::Helpers::KnowledgeBoundary)
89
+ end
90
+
91
+ it 'updates existing boundary for same domain' do
92
+ engine.set_boundary(domain: :math, confidence: 0.5)
93
+ b2 = engine.set_boundary(domain: :math, confidence: 0.9)
94
+ expect(b2.confidence).to eq(0.9)
95
+ end
96
+ end
97
+
98
+ describe '#detect_boundary_gap' do
99
+ it 'returns gap_detected: false when no boundary set' do
100
+ result = engine.detect_boundary_gap(domain: :unknown_domain, error_occurred: true)
101
+ expect(result[:gap_detected]).to be false
102
+ expect(result[:reason]).to eq(:no_boundary)
103
+ end
104
+
105
+ it 'returns gap_detected: true when error occurs and confidence is high' do
106
+ engine.set_boundary(domain: :physics, confidence: 0.8)
107
+ result = engine.detect_boundary_gap(domain: :physics, error_occurred: true)
108
+ expect(result[:gap_detected]).to be true
109
+ end
110
+
111
+ it 'returns gap_detected: false when no error' do
112
+ engine.set_boundary(domain: :physics, confidence: 0.8)
113
+ result = engine.detect_boundary_gap(domain: :physics, error_occurred: false)
114
+ expect(result[:gap_detected]).to be false
115
+ end
116
+ end
117
+
118
+ describe '#blindspots_by_domain' do
119
+ it 'returns blindspots matching domain' do
120
+ blindspot
121
+ results = engine.blindspots_by_domain(:reasoning)
122
+ expect(results.size).to eq(1)
123
+ expect(results.first.domain).to eq(:reasoning)
124
+ end
125
+
126
+ it 'returns empty for non-existent domain' do
127
+ expect(engine.blindspots_by_domain(:unknown_xyz)).to be_empty
128
+ end
129
+ end
130
+
131
+ describe '#active_blindspots' do
132
+ it 'returns only active blindspots' do
133
+ blindspot
134
+ expect(engine.active_blindspots.size).to eq(1)
135
+ end
136
+
137
+ it 'excludes acknowledged blindspots' do
138
+ engine.acknowledge_blindspot(blindspot_id: blindspot.id)
139
+ expect(engine.active_blindspots).to be_empty
140
+ end
141
+ end
142
+
143
+ describe '#acknowledged_blindspots' do
144
+ it 'returns acknowledged blindspots' do
145
+ engine.acknowledge_blindspot(blindspot_id: blindspot.id)
146
+ expect(engine.acknowledged_blindspots.size).to eq(1)
147
+ end
148
+ end
149
+
150
+ describe '#resolved_blindspots' do
151
+ it 'returns resolved blindspots' do
152
+ engine.resolve_blindspot(blindspot_id: blindspot.id)
153
+ expect(engine.resolved_blindspots.size).to eq(1)
154
+ end
155
+ end
156
+
157
+ describe '#most_severe' do
158
+ it 'returns blindspots sorted by severity descending' do
159
+ engine.register_blindspot(domain: :a, discovered_by: :unknown,
160
+ description: 'low', severity: 0.2)
161
+ high = engine.register_blindspot(domain: :b, discovered_by: :unknown,
162
+ description: 'high', severity: 0.9)
163
+ result = engine.most_severe(limit: 2)
164
+ expect(result.first.id).to eq(high.id)
165
+ end
166
+
167
+ it 'respects limit' do
168
+ 3.times { |i| engine.register_blindspot(domain: :x, discovered_by: :unknown, description: "s#{i}") }
169
+ expect(engine.most_severe(limit: 2).size).to eq(2)
170
+ end
171
+ end
172
+
173
+ describe '#mitigation_strategies' do
174
+ it 'returns strategies for active blindspots' do
175
+ blindspot
176
+ strategies = engine.mitigation_strategies
177
+ expect(strategies.size).to eq(1)
178
+ expect(strategies.first).to include(:blindspot_id, :domain, :severity, :strategy)
179
+ end
180
+
181
+ it 'returns strategies filtered by domain' do
182
+ blindspot
183
+ engine.register_blindspot(domain: :other, discovered_by: :unknown, description: 'other')
184
+ strategies = engine.mitigation_strategies(domain: :reasoning)
185
+ expect(strategies.size).to eq(1)
186
+ end
187
+
188
+ it 'returns empty after all are acknowledged' do
189
+ engine.acknowledge_blindspot(blindspot_id: blindspot.id)
190
+ expect(engine.mitigation_strategies).to be_empty
191
+ end
192
+ end
193
+
194
+ describe '#coverage_report' do
195
+ it 'returns empty when no boundaries set' do
196
+ expect(engine.coverage_report).to be_empty
197
+ end
198
+
199
+ it 'returns boundaries as hashes' do
200
+ engine.set_boundary(domain: :logic, confidence: 0.7)
201
+ report = engine.coverage_report
202
+ expect(report.size).to eq(1)
203
+ expect(report.first).to include(:domain, :confidence, :coverage_estimate)
204
+ end
205
+ end
206
+
207
+ describe '#awareness_label' do
208
+ it 'returns :unaware when score is 0' do
209
+ engine.register_blindspot(domain: :x, discovered_by: :unknown, description: 'x')
210
+ expect(engine.awareness_label).to be_a(Symbol)
211
+ end
212
+
213
+ it 'returns :highly_aware at score 1.0' do
214
+ expect(engine.awareness_label).to eq(:highly_aware)
215
+ end
216
+ end
217
+
218
+ describe '#awareness_gap' do
219
+ it 'returns 0.0 when no blindspots' do
220
+ expect(engine.awareness_gap).to eq(0.0)
221
+ end
222
+
223
+ it 'is complement of awareness_score' do
224
+ blindspot
225
+ expect((engine.awareness_score + engine.awareness_gap).round(10)).to eq(1.0)
226
+ end
227
+ end
228
+
229
+ describe '#johari_report' do
230
+ it 'returns comprehensive report' do
231
+ blindspot
232
+ report = engine.johari_report
233
+ expect(report).to include(:total_blindspots, :active, :acknowledged, :resolved,
234
+ :awareness_score, :awareness_label, :awareness_gap,
235
+ :boundaries_tracked, :most_severe)
236
+ end
237
+ end
238
+
239
+ describe '#to_h' do
240
+ it 'returns summary stats' do
241
+ h = engine.to_h
242
+ expect(h).to include(:total_blindspots, :active, :acknowledged,
243
+ :resolved, :awareness_score, :awareness_label)
244
+ end
245
+ end
246
+ end