lex-agentic-executive 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 (296) 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-executive.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/executive/autopilot/client.rb +19 -0
  8. data/lib/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine.rb +161 -0
  9. data/lib/legion/extensions/agentic/executive/autopilot/helpers/constants.rb +62 -0
  10. data/lib/legion/extensions/agentic/executive/autopilot/helpers/mode_event.rb +51 -0
  11. data/lib/legion/extensions/agentic/executive/autopilot/helpers/routine.rb +91 -0
  12. data/lib/legion/extensions/agentic/executive/autopilot/runners/cognitive_autopilot.rb +93 -0
  13. data/lib/legion/extensions/agentic/executive/autopilot/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/executive/autopilot.rb +20 -0
  15. data/lib/legion/extensions/agentic/executive/chunking/client.rb +21 -0
  16. data/lib/legion/extensions/agentic/executive/chunking/helpers/chunk.rb +92 -0
  17. data/lib/legion/extensions/agentic/executive/chunking/helpers/chunking_engine.rb +147 -0
  18. data/lib/legion/extensions/agentic/executive/chunking/helpers/constants.rb +56 -0
  19. data/lib/legion/extensions/agentic/executive/chunking/helpers/information_item.rb +51 -0
  20. data/lib/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking.rb +111 -0
  21. data/lib/legion/extensions/agentic/executive/chunking/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/executive/chunking.rb +21 -0
  23. data/lib/legion/extensions/agentic/executive/cognitive_debt/client.rb +28 -0
  24. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/constants.rb +36 -0
  25. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine.rb +118 -0
  26. data/lib/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item.rb +83 -0
  27. data/lib/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt.rb +84 -0
  28. data/lib/legion/extensions/agentic/executive/cognitive_debt/version.rb +13 -0
  29. data/lib/legion/extensions/agentic/executive/cognitive_debt.rb +19 -0
  30. data/lib/legion/extensions/agentic/executive/compass/client.rb +15 -0
  31. data/lib/legion/extensions/agentic/executive/compass/helpers/bearing.rb +79 -0
  32. data/lib/legion/extensions/agentic/executive/compass/helpers/compass_engine.rb +108 -0
  33. data/lib/legion/extensions/agentic/executive/compass/helpers/constants.rb +65 -0
  34. data/lib/legion/extensions/agentic/executive/compass/helpers/magnetic_bias.rb +81 -0
  35. data/lib/legion/extensions/agentic/executive/compass/runners/cognitive_compass.rb +76 -0
  36. data/lib/legion/extensions/agentic/executive/compass/version.rb +13 -0
  37. data/lib/legion/extensions/agentic/executive/compass.rb +22 -0
  38. data/lib/legion/extensions/agentic/executive/control/client.rb +19 -0
  39. data/lib/legion/extensions/agentic/executive/control/helpers/constants.rb +45 -0
  40. data/lib/legion/extensions/agentic/executive/control/helpers/control_signal.rb +79 -0
  41. data/lib/legion/extensions/agentic/executive/control/helpers/controller.rb +140 -0
  42. data/lib/legion/extensions/agentic/executive/control/helpers/goal.rb +72 -0
  43. data/lib/legion/extensions/agentic/executive/control/runners/cognitive_control.rb +74 -0
  44. data/lib/legion/extensions/agentic/executive/control/version.rb +13 -0
  45. data/lib/legion/extensions/agentic/executive/control.rb +21 -0
  46. data/lib/legion/extensions/agentic/executive/decision_fatigue/client.rb +28 -0
  47. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/constants.rb +51 -0
  48. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record.rb +50 -0
  49. data/lib/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine.rb +114 -0
  50. data/lib/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue.rb +94 -0
  51. data/lib/legion/extensions/agentic/executive/decision_fatigue/version.rb +13 -0
  52. data/lib/legion/extensions/agentic/executive/decision_fatigue.rb +19 -0
  53. data/lib/legion/extensions/agentic/executive/disengagement/client.rb +24 -0
  54. data/lib/legion/extensions/agentic/executive/disengagement/helpers/constants.rb +48 -0
  55. data/lib/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine.rb +101 -0
  56. data/lib/legion/extensions/agentic/executive/disengagement/helpers/goal.rb +105 -0
  57. data/lib/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement.rb +90 -0
  58. data/lib/legion/extensions/agentic/executive/disengagement/version.rb +13 -0
  59. data/lib/legion/extensions/agentic/executive/disengagement.rb +19 -0
  60. data/lib/legion/extensions/agentic/executive/dissonance_resolution/client.rb +19 -0
  61. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/constants.rb +38 -0
  62. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict.rb +90 -0
  63. data/lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb +155 -0
  64. data/lib/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution.rb +74 -0
  65. data/lib/legion/extensions/agentic/executive/dissonance_resolution/version.rb +13 -0
  66. data/lib/legion/extensions/agentic/executive/dissonance_resolution.rb +19 -0
  67. data/lib/legion/extensions/agentic/executive/dual_process/client.rb +25 -0
  68. data/lib/legion/extensions/agentic/executive/dual_process/helpers/constants.rb +44 -0
  69. data/lib/legion/extensions/agentic/executive/dual_process/helpers/decision.rb +50 -0
  70. data/lib/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine.rb +200 -0
  71. data/lib/legion/extensions/agentic/executive/dual_process/helpers/heuristic.rb +67 -0
  72. data/lib/legion/extensions/agentic/executive/dual_process/runners/dual_process.rb +87 -0
  73. data/lib/legion/extensions/agentic/executive/dual_process/version.rb +13 -0
  74. data/lib/legion/extensions/agentic/executive/dual_process.rb +20 -0
  75. data/lib/legion/extensions/agentic/executive/dwell/client.rb +19 -0
  76. data/lib/legion/extensions/agentic/executive/dwell/helpers/constants.rb +65 -0
  77. data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_engine.rb +126 -0
  78. data/lib/legion/extensions/agentic/executive/dwell/helpers/dwell_topic.rb +119 -0
  79. data/lib/legion/extensions/agentic/executive/dwell/runners/cognitive_dwell.rb +87 -0
  80. data/lib/legion/extensions/agentic/executive/dwell/version.rb +13 -0
  81. data/lib/legion/extensions/agentic/executive/dwell.rb +19 -0
  82. data/lib/legion/extensions/agentic/executive/executive_function/actors/recovery.rb +45 -0
  83. data/lib/legion/extensions/agentic/executive/executive_function/client.rb +27 -0
  84. data/lib/legion/extensions/agentic/executive/executive_function/helpers/ef_component.rb +58 -0
  85. data/lib/legion/extensions/agentic/executive/executive_function/helpers/executive_controller.rb +129 -0
  86. data/lib/legion/extensions/agentic/executive/executive_function/runners/executive_function.rb +104 -0
  87. data/lib/legion/extensions/agentic/executive/executive_function/version.rb +13 -0
  88. data/lib/legion/extensions/agentic/executive/executive_function.rb +18 -0
  89. data/lib/legion/extensions/agentic/executive/flexibility/actors/tick.rb +31 -0
  90. data/lib/legion/extensions/agentic/executive/flexibility/client.rb +28 -0
  91. data/lib/legion/extensions/agentic/executive/flexibility/helpers/constants.rb +39 -0
  92. data/lib/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine.rb +109 -0
  93. data/lib/legion/extensions/agentic/executive/flexibility/helpers/task_set.rb +69 -0
  94. data/lib/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility.rb +77 -0
  95. data/lib/legion/extensions/agentic/executive/flexibility/version.rb +13 -0
  96. data/lib/legion/extensions/agentic/executive/flexibility.rb +19 -0
  97. data/lib/legion/extensions/agentic/executive/flexibility_training/client.rb +29 -0
  98. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/constants.rb +57 -0
  99. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine.rb +178 -0
  100. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial.rb +54 -0
  101. data/lib/legion/extensions/agentic/executive/flexibility_training/helpers/training_task.rb +54 -0
  102. data/lib/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training.rb +134 -0
  103. data/lib/legion/extensions/agentic/executive/flexibility_training/version.rb +13 -0
  104. data/lib/legion/extensions/agentic/executive/flexibility_training.rb +20 -0
  105. data/lib/legion/extensions/agentic/executive/goal_management/client.rb +28 -0
  106. data/lib/legion/extensions/agentic/executive/goal_management/helpers/constants.rb +49 -0
  107. data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal.rb +153 -0
  108. data/lib/legion/extensions/agentic/executive/goal_management/helpers/goal_engine.rb +265 -0
  109. data/lib/legion/extensions/agentic/executive/goal_management/runners/goal_management.rb +169 -0
  110. data/lib/legion/extensions/agentic/executive/goal_management/version.rb +13 -0
  111. data/lib/legion/extensions/agentic/executive/goal_management.rb +19 -0
  112. data/lib/legion/extensions/agentic/executive/inertia/client.rb +15 -0
  113. data/lib/legion/extensions/agentic/executive/inertia/helpers/belief.rb +99 -0
  114. data/lib/legion/extensions/agentic/executive/inertia/helpers/constants.rb +45 -0
  115. data/lib/legion/extensions/agentic/executive/inertia/helpers/inertia_engine.rb +111 -0
  116. data/lib/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia.rb +74 -0
  117. data/lib/legion/extensions/agentic/executive/inertia/version.rb +13 -0
  118. data/lib/legion/extensions/agentic/executive/inertia.rb +19 -0
  119. data/lib/legion/extensions/agentic/executive/inhibition/client.rb +27 -0
  120. data/lib/legion/extensions/agentic/executive/inhibition/helpers/constants.rb +36 -0
  121. data/lib/legion/extensions/agentic/executive/inhibition/helpers/impulse.rb +37 -0
  122. data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model.rb +122 -0
  123. data/lib/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store.rb +72 -0
  124. data/lib/legion/extensions/agentic/executive/inhibition/runners/inhibition.rb +155 -0
  125. data/lib/legion/extensions/agentic/executive/inhibition/version.rb +13 -0
  126. data/lib/legion/extensions/agentic/executive/inhibition.rb +20 -0
  127. data/lib/legion/extensions/agentic/executive/load/client.rb +25 -0
  128. data/lib/legion/extensions/agentic/executive/load/helpers/constants.rb +36 -0
  129. data/lib/legion/extensions/agentic/executive/load/helpers/load_model.rb +146 -0
  130. data/lib/legion/extensions/agentic/executive/load/runners/cognitive_load.rb +120 -0
  131. data/lib/legion/extensions/agentic/executive/load/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/executive/load.rb +18 -0
  133. data/lib/legion/extensions/agentic/executive/load_balancing/client.rb +19 -0
  134. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/constants.rb +44 -0
  135. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer.rb +137 -0
  136. data/lib/legion/extensions/agentic/executive/load_balancing/helpers/subsystem.rb +101 -0
  137. data/lib/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing.rb +69 -0
  138. data/lib/legion/extensions/agentic/executive/load_balancing/version.rb +13 -0
  139. data/lib/legion/extensions/agentic/executive/load_balancing.rb +19 -0
  140. data/lib/legion/extensions/agentic/executive/planning/client.rb +27 -0
  141. data/lib/legion/extensions/agentic/executive/planning/helpers/constants.rb +26 -0
  142. data/lib/legion/extensions/agentic/executive/planning/helpers/plan.rb +110 -0
  143. data/lib/legion/extensions/agentic/executive/planning/helpers/plan_step.rb +82 -0
  144. data/lib/legion/extensions/agentic/executive/planning/helpers/plan_store.rb +161 -0
  145. data/lib/legion/extensions/agentic/executive/planning/runners/planning.rb +123 -0
  146. data/lib/legion/extensions/agentic/executive/planning/version.rb +13 -0
  147. data/lib/legion/extensions/agentic/executive/planning.rb +20 -0
  148. data/lib/legion/extensions/agentic/executive/prospective_memory/client.rb +28 -0
  149. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/constants.rb +32 -0
  150. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/intention.rb +94 -0
  151. data/lib/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine.rb +157 -0
  152. data/lib/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory.rb +146 -0
  153. data/lib/legion/extensions/agentic/executive/prospective_memory/version.rb +13 -0
  154. data/lib/legion/extensions/agentic/executive/prospective_memory.rb +19 -0
  155. data/lib/legion/extensions/agentic/executive/triage/client.rb +19 -0
  156. data/lib/legion/extensions/agentic/executive/triage/helpers/constants.rb +70 -0
  157. data/lib/legion/extensions/agentic/executive/triage/helpers/demand.rb +101 -0
  158. data/lib/legion/extensions/agentic/executive/triage/helpers/triage_engine.rb +150 -0
  159. data/lib/legion/extensions/agentic/executive/triage/runners/cognitive_triage.rb +110 -0
  160. data/lib/legion/extensions/agentic/executive/triage/version.rb +13 -0
  161. data/lib/legion/extensions/agentic/executive/triage.rb +19 -0
  162. data/lib/legion/extensions/agentic/executive/version.rb +11 -0
  163. data/lib/legion/extensions/agentic/executive/volition/client.rb +27 -0
  164. data/lib/legion/extensions/agentic/executive/volition/helpers/constants.rb +51 -0
  165. data/lib/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer.rb +158 -0
  166. data/lib/legion/extensions/agentic/executive/volition/helpers/intention.rb +56 -0
  167. data/lib/legion/extensions/agentic/executive/volition/helpers/intention_stack.rb +140 -0
  168. data/lib/legion/extensions/agentic/executive/volition/runners/volition.rb +129 -0
  169. data/lib/legion/extensions/agentic/executive/volition/version.rb +13 -0
  170. data/lib/legion/extensions/agentic/executive/volition.rb +20 -0
  171. data/lib/legion/extensions/agentic/executive/working_memory/client.rb +21 -0
  172. data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer.rb +124 -0
  173. data/lib/legion/extensions/agentic/executive/working_memory/helpers/buffer_item.rb +72 -0
  174. data/lib/legion/extensions/agentic/executive/working_memory/helpers/constants.rb +47 -0
  175. data/lib/legion/extensions/agentic/executive/working_memory/runners/working_memory.rb +102 -0
  176. data/lib/legion/extensions/agentic/executive/working_memory/version.rb +13 -0
  177. data/lib/legion/extensions/agentic/executive/working_memory.rb +19 -0
  178. data/lib/legion/extensions/agentic/executive.rb +40 -0
  179. data/spec/legion/extensions/agentic/executive/autopilot/client_spec.rb +21 -0
  180. data/spec/legion/extensions/agentic/executive/autopilot/cognitive_autopilot_spec.rb +7 -0
  181. data/spec/legion/extensions/agentic/executive/autopilot/helpers/autopilot_engine_spec.rb +166 -0
  182. data/spec/legion/extensions/agentic/executive/autopilot/helpers/constants_spec.rb +37 -0
  183. data/spec/legion/extensions/agentic/executive/autopilot/helpers/mode_event_spec.rb +30 -0
  184. data/spec/legion/extensions/agentic/executive/autopilot/helpers/routine_spec.rb +133 -0
  185. data/spec/legion/extensions/agentic/executive/autopilot/runners_spec.rb +108 -0
  186. data/spec/legion/extensions/agentic/executive/chunking/client_spec.rb +67 -0
  187. data/spec/legion/extensions/agentic/executive/chunking/helpers/chunk_spec.rb +187 -0
  188. data/spec/legion/extensions/agentic/executive/chunking/helpers/chunking_engine_spec.rb +290 -0
  189. data/spec/legion/extensions/agentic/executive/chunking/helpers/constants_spec.rb +116 -0
  190. data/spec/legion/extensions/agentic/executive/chunking/helpers/information_item_spec.rb +75 -0
  191. data/spec/legion/extensions/agentic/executive/chunking/runners/cognitive_chunking_spec.rb +169 -0
  192. data/spec/legion/extensions/agentic/executive/cognitive_debt/client_spec.rb +73 -0
  193. data/spec/legion/extensions/agentic/executive/cognitive_debt/cognitive_debt_spec.rb +15 -0
  194. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/constants_spec.rb +78 -0
  195. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_engine_spec.rb +297 -0
  196. data/spec/legion/extensions/agentic/executive/cognitive_debt/helpers/debt_item_spec.rb +233 -0
  197. data/spec/legion/extensions/agentic/executive/cognitive_debt/runners/cognitive_debt_spec.rb +196 -0
  198. data/spec/legion/extensions/agentic/executive/compass/client_spec.rb +16 -0
  199. data/spec/legion/extensions/agentic/executive/compass/helpers/bearing_spec.rb +93 -0
  200. data/spec/legion/extensions/agentic/executive/compass/helpers/compass_engine_spec.rb +113 -0
  201. data/spec/legion/extensions/agentic/executive/compass/helpers/constants_spec.rb +45 -0
  202. data/spec/legion/extensions/agentic/executive/compass/helpers/magnetic_bias_spec.rb +103 -0
  203. data/spec/legion/extensions/agentic/executive/compass/runners/cognitive_compass_spec.rb +80 -0
  204. data/spec/legion/extensions/agentic/executive/control/client_spec.rb +23 -0
  205. data/spec/legion/extensions/agentic/executive/control/helpers/control_signal_spec.rb +118 -0
  206. data/spec/legion/extensions/agentic/executive/control/helpers/controller_spec.rb +167 -0
  207. data/spec/legion/extensions/agentic/executive/control/helpers/goal_spec.rb +99 -0
  208. data/spec/legion/extensions/agentic/executive/control/runners/cognitive_control_spec.rb +107 -0
  209. data/spec/legion/extensions/agentic/executive/decision_fatigue/client_spec.rb +24 -0
  210. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/constants_spec.rb +93 -0
  211. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/decision_record_spec.rb +89 -0
  212. data/spec/legion/extensions/agentic/executive/decision_fatigue/helpers/fatigue_engine_spec.rb +216 -0
  213. data/spec/legion/extensions/agentic/executive/decision_fatigue/runners/decision_fatigue_spec.rb +180 -0
  214. data/spec/legion/extensions/agentic/executive/disengagement/helpers/constants_spec.rb +81 -0
  215. data/spec/legion/extensions/agentic/executive/disengagement/helpers/disengagement_engine_spec.rb +213 -0
  216. data/spec/legion/extensions/agentic/executive/disengagement/helpers/goal_spec.rb +289 -0
  217. data/spec/legion/extensions/agentic/executive/disengagement/runners/cognitive_disengagement_spec.rb +215 -0
  218. data/spec/legion/extensions/agentic/executive/dissonance_resolution/client_spec.rb +20 -0
  219. data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/dissonance_conflict_spec.rb +107 -0
  220. data/spec/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine_spec.rb +122 -0
  221. data/spec/legion/extensions/agentic/executive/dissonance_resolution/runners/cognitive_dissonance_resolution_spec.rb +49 -0
  222. data/spec/legion/extensions/agentic/executive/dual_process/client_spec.rb +74 -0
  223. data/spec/legion/extensions/agentic/executive/dual_process/helpers/constants_spec.rb +55 -0
  224. data/spec/legion/extensions/agentic/executive/dual_process/helpers/decision_spec.rb +76 -0
  225. data/spec/legion/extensions/agentic/executive/dual_process/helpers/dual_process_engine_spec.rb +274 -0
  226. data/spec/legion/extensions/agentic/executive/dual_process/helpers/heuristic_spec.rb +144 -0
  227. data/spec/legion/extensions/agentic/executive/dual_process/runners/dual_process_spec.rb +188 -0
  228. data/spec/legion/extensions/agentic/executive/dwell/cognitive_dwell_spec.rb +7 -0
  229. data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_engine_spec.rb +136 -0
  230. data/spec/legion/extensions/agentic/executive/dwell/helpers/dwell_topic_spec.rb +152 -0
  231. data/spec/legion/extensions/agentic/executive/executive_function/client_spec.rb +40 -0
  232. data/spec/legion/extensions/agentic/executive/executive_function/helpers/ef_component_spec.rb +108 -0
  233. data/spec/legion/extensions/agentic/executive/executive_function/helpers/executive_controller_spec.rb +136 -0
  234. data/spec/legion/extensions/agentic/executive/executive_function/runners/executive_function_spec.rb +191 -0
  235. data/spec/legion/extensions/agentic/executive/flexibility/client_spec.rb +20 -0
  236. data/spec/legion/extensions/agentic/executive/flexibility/helpers/flexibility_engine_spec.rb +119 -0
  237. data/spec/legion/extensions/agentic/executive/flexibility/helpers/task_set_spec.rb +87 -0
  238. data/spec/legion/extensions/agentic/executive/flexibility/runners/cognitive_flexibility_spec.rb +69 -0
  239. data/spec/legion/extensions/agentic/executive/flexibility_training/client_spec.rb +39 -0
  240. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/constants_spec.rb +67 -0
  241. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/flexibility_engine_spec.rb +209 -0
  242. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/switch_trial_spec.rb +77 -0
  243. data/spec/legion/extensions/agentic/executive/flexibility_training/helpers/training_task_spec.rb +97 -0
  244. data/spec/legion/extensions/agentic/executive/flexibility_training/runners/cognitive_flexibility_training_spec.rb +171 -0
  245. data/spec/legion/extensions/agentic/executive/goal_management/client_spec.rb +34 -0
  246. data/spec/legion/extensions/agentic/executive/goal_management/goal_management_spec.rb +11 -0
  247. data/spec/legion/extensions/agentic/executive/goal_management/helpers/constants_spec.rb +94 -0
  248. data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_engine_spec.rb +358 -0
  249. data/spec/legion/extensions/agentic/executive/goal_management/helpers/goal_spec.rb +283 -0
  250. data/spec/legion/extensions/agentic/executive/goal_management/runners/goal_management_spec.rb +244 -0
  251. data/spec/legion/extensions/agentic/executive/inertia/helpers/belief_spec.rb +128 -0
  252. data/spec/legion/extensions/agentic/executive/inertia/helpers/inertia_engine_spec.rb +104 -0
  253. data/spec/legion/extensions/agentic/executive/inertia/runners/cognitive_inertia_spec.rb +59 -0
  254. data/spec/legion/extensions/agentic/executive/inhibition/client_spec.rb +43 -0
  255. data/spec/legion/extensions/agentic/executive/inhibition/helpers/constants_spec.rb +108 -0
  256. data/spec/legion/extensions/agentic/executive/inhibition/helpers/impulse_spec.rb +101 -0
  257. data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_model_spec.rb +245 -0
  258. data/spec/legion/extensions/agentic/executive/inhibition/helpers/inhibition_store_spec.rb +126 -0
  259. data/spec/legion/extensions/agentic/executive/inhibition/runners/inhibition_spec.rb +242 -0
  260. data/spec/legion/extensions/agentic/executive/load/client_spec.rb +94 -0
  261. data/spec/legion/extensions/agentic/executive/load/helpers/constants_spec.rb +62 -0
  262. data/spec/legion/extensions/agentic/executive/load/helpers/load_model_spec.rb +314 -0
  263. data/spec/legion/extensions/agentic/executive/load/runners/cognitive_load_spec.rb +231 -0
  264. data/spec/legion/extensions/agentic/executive/load_balancing/client_spec.rb +20 -0
  265. data/spec/legion/extensions/agentic/executive/load_balancing/helpers/load_balancer_spec.rb +106 -0
  266. data/spec/legion/extensions/agentic/executive/load_balancing/helpers/subsystem_spec.rb +106 -0
  267. data/spec/legion/extensions/agentic/executive/load_balancing/runners/cognitive_load_balancing_spec.rb +52 -0
  268. data/spec/legion/extensions/agentic/executive/planning/client_spec.rb +91 -0
  269. data/spec/legion/extensions/agentic/executive/planning/helpers/constants_spec.rb +91 -0
  270. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_spec.rb +230 -0
  271. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_step_spec.rb +159 -0
  272. data/spec/legion/extensions/agentic/executive/planning/helpers/plan_store_spec.rb +317 -0
  273. data/spec/legion/extensions/agentic/executive/planning/runners/planning_spec.rb +217 -0
  274. data/spec/legion/extensions/agentic/executive/prospective_memory/client_spec.rb +24 -0
  275. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/constants_spec.rb +84 -0
  276. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/intention_spec.rb +194 -0
  277. data/spec/legion/extensions/agentic/executive/prospective_memory/helpers/prospective_engine_spec.rb +255 -0
  278. data/spec/legion/extensions/agentic/executive/prospective_memory/runners/prospective_memory_spec.rb +220 -0
  279. data/spec/legion/extensions/agentic/executive/triage/client_spec.rb +28 -0
  280. data/spec/legion/extensions/agentic/executive/triage/cognitive_triage_spec.rb +7 -0
  281. data/spec/legion/extensions/agentic/executive/triage/helpers/constants_spec.rb +41 -0
  282. data/spec/legion/extensions/agentic/executive/triage/helpers/demand_spec.rb +139 -0
  283. data/spec/legion/extensions/agentic/executive/triage/helpers/triage_engine_spec.rb +183 -0
  284. data/spec/legion/extensions/agentic/executive/triage/runners_spec.rb +127 -0
  285. data/spec/legion/extensions/agentic/executive/volition/client_spec.rb +25 -0
  286. data/spec/legion/extensions/agentic/executive/volition/helpers/drive_synthesizer_spec.rb +99 -0
  287. data/spec/legion/extensions/agentic/executive/volition/helpers/intention_spec.rb +93 -0
  288. data/spec/legion/extensions/agentic/executive/volition/helpers/intention_stack_spec.rb +129 -0
  289. data/spec/legion/extensions/agentic/executive/volition/runners/volition_spec.rb +135 -0
  290. data/spec/legion/extensions/agentic/executive/working_memory/client_spec.rb +93 -0
  291. data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_item_spec.rb +185 -0
  292. data/spec/legion/extensions/agentic/executive/working_memory/helpers/buffer_spec.rb +232 -0
  293. data/spec/legion/extensions/agentic/executive/working_memory/helpers/constants_spec.rb +99 -0
  294. data/spec/legion/extensions/agentic/executive/working_memory/runners/working_memory_spec.rb +191 -0
  295. data/spec/spec_helper.rb +46 -0
  296. metadata +380 -0
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::WorkingMemory::Client do
6
+ subject(:client) { described_class.new }
7
+
8
+ describe '#initialize' do
9
+ it 'creates a default buffer' do
10
+ expect(client.buffer).to be_a(Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Buffer)
11
+ end
12
+
13
+ it 'accepts an injected buffer' do
14
+ custom = Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Buffer.new
15
+ injected = described_class.new(buffer: custom)
16
+ expect(injected.buffer).to equal(custom)
17
+ end
18
+ end
19
+
20
+ describe 'full workflow integration' do
21
+ it 'stores, retrieves, rehearses, and decays items through the cognitive cycle' do
22
+ # Store items across buffer types
23
+ verbal = client.store_item(content: 'spoken word', buffer_type: :verbal, priority: :normal, tags: [:conversation])
24
+ spatial = client.store_item(content: 'map layout', buffer_type: :spatial, priority: :high, tags: [:navigation])
25
+ episodic = client.store_item(content: 'meeting memory', buffer_type: :episodic, priority: :critical, tags: [:work])
26
+
27
+ expect(verbal[:success]).to be true
28
+ expect(spatial[:success]).to be true
29
+ expect(episodic[:success]).to be true
30
+
31
+ # Check status
32
+ status = client.buffer_status
33
+ expect(status[:status][:size]).to eq(3)
34
+
35
+ # Retrieve by type
36
+ verbal_items = client.retrieve_by_type(buffer_type: :verbal)
37
+ expect(verbal_items[:count]).to eq(1)
38
+
39
+ # Retrieve by tag
40
+ work_items = client.retrieve_by_tag(tag: :work)
41
+ expect(work_items[:count]).to eq(1)
42
+
43
+ # Rehearse the verbal item to prevent decay
44
+ rehearsed = client.rehearse_item(id: verbal[:item][:id])
45
+ expect(rehearsed[:item][:rehearsal_count]).to eq(1)
46
+
47
+ # Run a tick (decay cycle)
48
+ tick_result = client.update_working_memory
49
+ expect(tick_result[:success]).to be true
50
+
51
+ # Critical item should be a consolidation candidate
52
+ candidates = client.consolidation_candidates
53
+ expect(candidates[:count]).to be >= 1
54
+
55
+ # Find interference between same-type same-tag items
56
+ client.store_item(content: 'another conversation', buffer_type: :verbal, priority: :normal, tags: [:conversation])
57
+ interference = client.find_interference(id: verbal[:item][:id])
58
+ expect(interference[:count]).to be >= 1
59
+
60
+ # Stats reflect the current state
61
+ stats = client.working_memory_stats
62
+ expect(stats[:size]).to eq(4)
63
+ expect(stats[:load]).to be > 0.0
64
+
65
+ # Remove an item
66
+ client.remove_item(id: spatial[:item][:id])
67
+ expect(client.working_memory_stats[:size]).to eq(3)
68
+
69
+ # Clear everything
70
+ client.clear_buffer
71
+ expect(client.working_memory_stats[:size]).to eq(0)
72
+ end
73
+
74
+ it 'models the 7 plus-or-minus 2 capacity limit' do
75
+ # Fill to base capacity
76
+ 7.times { |i| client.store_item(content: "item #{i}", priority: :normal) }
77
+ expect(client.buffer.size).to eq(7)
78
+
79
+ # Without chunking, adding more evicts lowest activation
80
+ 3.times { |i| client.store_item(content: "overflow #{i}", priority: :high) }
81
+ expect(client.buffer.size).to be <= client.buffer.capacity
82
+ end
83
+
84
+ it 'demonstrates chunking bonus' do
85
+ # Add items with shared tags to trigger chunking
86
+ 3.times { |i| client.store_item(content: "group_a_#{i}", tags: [:group_a]) }
87
+ 3.times { |i| client.store_item(content: "group_b_#{i}", tags: [:group_b]) }
88
+
89
+ # Capacity should exceed base due to chunking
90
+ expect(client.buffer.capacity).to be > Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants::CAPACITY
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::BufferItem do
6
+ subject(:item) { described_class.new(content: 'test content', buffer_type: :verbal, priority: :normal, tags: [:test]) }
7
+
8
+ describe '#initialize' do
9
+ it 'generates a uuid id' do
10
+ expect(item.id).to match(/\A[0-9a-f-]{36}\z/)
11
+ end
12
+
13
+ it 'stores content' do
14
+ expect(item.content).to eq('test content')
15
+ end
16
+
17
+ it 'stores buffer_type' do
18
+ expect(item.buffer_type).to eq(:verbal)
19
+ end
20
+
21
+ it 'stores priority' do
22
+ expect(item.priority).to eq(:normal)
23
+ end
24
+
25
+ it 'stores tags' do
26
+ expect(item.tags).to eq([:test])
27
+ end
28
+
29
+ it 'sets activation from priority level' do
30
+ expect(item.activation).to eq(0.5)
31
+ end
32
+
33
+ it 'sets critical priority to 1.0 activation' do
34
+ critical = described_class.new(content: 'urgent', priority: :critical)
35
+ expect(critical.activation).to eq(1.0)
36
+ end
37
+
38
+ it 'sets low priority to 0.25 activation' do
39
+ low = described_class.new(content: 'low', priority: :low)
40
+ expect(low.activation).to eq(0.25)
41
+ end
42
+
43
+ it 'starts with zero rehearsal count' do
44
+ expect(item.rehearsal_count).to eq(0)
45
+ end
46
+
47
+ it 'starts with zero age ticks' do
48
+ expect(item.age_ticks).to eq(0)
49
+ end
50
+
51
+ it 'records created_at' do
52
+ expect(item.created_at).to be_a(Time)
53
+ end
54
+
55
+ it 'defaults buffer_type to episodic' do
56
+ default_item = described_class.new(content: 'x')
57
+ expect(default_item.buffer_type).to eq(:episodic)
58
+ end
59
+
60
+ it 'defaults tags to empty array' do
61
+ default_item = described_class.new(content: 'x')
62
+ expect(default_item.tags).to eq([])
63
+ end
64
+ end
65
+
66
+ describe '#rehearse' do
67
+ it 'increments rehearsal count' do
68
+ item.rehearse
69
+ expect(item.rehearsal_count).to eq(1)
70
+ end
71
+
72
+ it 'boosts activation' do
73
+ initial = item.activation
74
+ item.rehearse
75
+ expect(item.activation).to eq(initial + Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants::REHEARSAL_BOOST)
76
+ end
77
+
78
+ it 'caps activation at 1.0' do
79
+ critical = described_class.new(content: 'urgent', priority: :critical)
80
+ critical.rehearse
81
+ expect(critical.activation).to eq(1.0)
82
+ end
83
+
84
+ it 'resets age ticks to zero' do
85
+ item.decay
86
+ item.decay
87
+ expect(item.age_ticks).to eq(2)
88
+ item.rehearse
89
+ expect(item.age_ticks).to eq(0)
90
+ end
91
+ end
92
+
93
+ describe '#decay' do
94
+ it 'increments age ticks' do
95
+ item.decay
96
+ expect(item.age_ticks).to eq(1)
97
+ end
98
+
99
+ it 'reduces activation' do
100
+ initial = item.activation
101
+ item.decay
102
+ expect(item.activation).to eq(initial - Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants::DECAY_RATE)
103
+ end
104
+
105
+ it 'floors activation at 0.0' do
106
+ bg = described_class.new(content: 'bg', priority: :background)
107
+ 10.times { bg.decay }
108
+ expect(bg.activation).to eq(0.0)
109
+ end
110
+ end
111
+
112
+ describe '#expired?' do
113
+ it 'is not expired when fresh' do
114
+ expect(item.expired?).to be false
115
+ end
116
+
117
+ it 'expires when activation reaches zero' do
118
+ bg = described_class.new(content: 'bg', priority: :background)
119
+ 10.times { bg.decay }
120
+ expect(bg.expired?).to be true
121
+ end
122
+
123
+ it 'expires when age exceeds MAX_AGE_TICKS' do
124
+ Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants::MAX_AGE_TICKS.times { item.decay }
125
+ expect(item.expired?).to be true
126
+ end
127
+ end
128
+
129
+ describe '#consolidation_ready?' do
130
+ it 'returns false for normal priority items' do
131
+ expect(item.consolidation_ready?).to be false
132
+ end
133
+
134
+ it 'returns true for critical priority items' do
135
+ critical = described_class.new(content: 'urgent', priority: :critical)
136
+ expect(critical.consolidation_ready?).to be true
137
+ end
138
+
139
+ it 'returns true after enough rehearsals' do
140
+ 3.times { item.rehearse }
141
+ expect(item.activation).to be >= Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants::CONSOLIDATION_THRESHOLD
142
+ expect(item.consolidation_ready?).to be true
143
+ end
144
+ end
145
+
146
+ describe '#interferes_with?' do
147
+ let(:other) { described_class.new(content: 'other', buffer_type: :verbal, priority: :normal, tags: [:test]) }
148
+
149
+ it 'detects interference between same-type same-tag items with similar activation' do
150
+ expect(item.interferes_with?(other)).to be true
151
+ end
152
+
153
+ it 'returns false for different buffer types' do
154
+ spatial = described_class.new(content: 'spatial', buffer_type: :spatial, priority: :normal, tags: [:test])
155
+ expect(item.interferes_with?(spatial)).to be false
156
+ end
157
+
158
+ it 'returns false for non-overlapping tags' do
159
+ no_overlap = described_class.new(content: 'other', buffer_type: :verbal, priority: :normal, tags: [:different])
160
+ expect(item.interferes_with?(no_overlap)).to be false
161
+ end
162
+
163
+ it 'returns false for non-BufferItem objects' do
164
+ expect(item.interferes_with?('not an item')).to be false
165
+ end
166
+
167
+ it 'returns false when activation difference exceeds threshold' do
168
+ critical = described_class.new(content: 'urgent', buffer_type: :verbal, priority: :critical, tags: [:test])
169
+ low = described_class.new(content: 'low', buffer_type: :verbal, priority: :low, tags: [:test])
170
+ expect(critical.interferes_with?(low)).to be false
171
+ end
172
+ end
173
+
174
+ describe '#to_h' do
175
+ it 'returns a hash with all fields' do
176
+ h = item.to_h
177
+ expect(h).to include(:id, :content, :buffer_type, :priority, :activation, :rehearsal_count, :age_ticks, :expired, :consolidation_ready)
178
+ end
179
+
180
+ it 'rounds activation to 4 decimal places' do
181
+ item.decay
182
+ expect(item.to_h[:activation]).to eq(item.activation.round(4))
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,232 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Buffer do
6
+ subject(:buffer) { described_class.new }
7
+
8
+ let(:constants) { Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants }
9
+
10
+ describe '#initialize' do
11
+ it 'starts empty' do
12
+ expect(buffer.items).to eq([])
13
+ expect(buffer.size).to eq(0)
14
+ end
15
+ end
16
+
17
+ describe '#store' do
18
+ it 'stores an item and returns it' do
19
+ item = buffer.store(content: 'hello')
20
+ expect(item).to be_a(Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::BufferItem)
21
+ expect(buffer.size).to eq(1)
22
+ end
23
+
24
+ it 'stores with custom buffer_type and priority' do
25
+ item = buffer.store(content: 'spatial data', buffer_type: :spatial, priority: :high)
26
+ expect(item.buffer_type).to eq(:spatial)
27
+ expect(item.priority).to eq(:high)
28
+ end
29
+
30
+ it 'stores with tags' do
31
+ item = buffer.store(content: 'tagged', tags: %i[important work])
32
+ expect(item.tags).to eq(%i[important work])
33
+ end
34
+
35
+ it 'evicts lowest-activation items when over capacity' do
36
+ (constants::CAPACITY + constants::CHUNK_BONUS + 2).times do |i|
37
+ buffer.store(content: "item #{i}", priority: :normal)
38
+ end
39
+ expect(buffer.size).to be <= buffer.capacity
40
+ end
41
+ end
42
+
43
+ describe '#retrieve' do
44
+ it 'finds an item by id' do
45
+ item = buffer.store(content: 'findme')
46
+ found = buffer.retrieve(item.id)
47
+ expect(found).to eq(item)
48
+ end
49
+
50
+ it 'returns nil for unknown id' do
51
+ expect(buffer.retrieve('nonexistent')).to be_nil
52
+ end
53
+ end
54
+
55
+ describe '#retrieve_by_tag' do
56
+ it 'returns items matching the tag' do
57
+ buffer.store(content: 'a', tags: [:work])
58
+ buffer.store(content: 'b', tags: [:play])
59
+ buffer.store(content: 'c', tags: %i[work play])
60
+
61
+ work_items = buffer.retrieve_by_tag(:work)
62
+ expect(work_items.size).to eq(2)
63
+ expect(work_items.map(&:content)).to contain_exactly('a', 'c')
64
+ end
65
+
66
+ it 'returns empty array for unmatched tag' do
67
+ buffer.store(content: 'a', tags: [:work])
68
+ expect(buffer.retrieve_by_tag(:missing)).to eq([])
69
+ end
70
+ end
71
+
72
+ describe '#retrieve_by_type' do
73
+ it 'returns items of the specified buffer type' do
74
+ buffer.store(content: 'v1', buffer_type: :verbal)
75
+ buffer.store(content: 's1', buffer_type: :spatial)
76
+ buffer.store(content: 'v2', buffer_type: :verbal)
77
+
78
+ verbal = buffer.retrieve_by_type(:verbal)
79
+ expect(verbal.size).to eq(2)
80
+ expect(verbal.map(&:content)).to contain_exactly('v1', 'v2')
81
+ end
82
+ end
83
+
84
+ describe '#rehearse' do
85
+ it 'rehearses an existing item' do
86
+ item = buffer.store(content: 'rehearse me')
87
+ initial_activation = item.activation
88
+ result = buffer.rehearse(item.id)
89
+ expect(result.activation).to be > initial_activation
90
+ expect(result.rehearsal_count).to eq(1)
91
+ end
92
+
93
+ it 'returns nil for unknown id' do
94
+ expect(buffer.rehearse('nonexistent')).to be_nil
95
+ end
96
+ end
97
+
98
+ describe '#remove' do
99
+ it 'removes an item by id' do
100
+ item = buffer.store(content: 'remove me')
101
+ buffer.remove(item.id)
102
+ expect(buffer.size).to eq(0)
103
+ expect(buffer.retrieve(item.id)).to be_nil
104
+ end
105
+ end
106
+
107
+ describe '#tick_decay' do
108
+ it 'decays all items' do
109
+ item = buffer.store(content: 'decaying', priority: :normal)
110
+ initial = item.activation
111
+ buffer.tick_decay
112
+ expect(item.activation).to be < initial
113
+ end
114
+
115
+ it 'removes expired items' do
116
+ item = buffer.store(content: 'expiring', priority: :background)
117
+ constants::MAX_AGE_TICKS.times { buffer.tick_decay }
118
+ expect(buffer.retrieve(item.id)).to be_nil
119
+ end
120
+ end
121
+
122
+ describe '#consolidation_candidates' do
123
+ it 'returns items above consolidation threshold' do
124
+ buffer.store(content: 'critical', priority: :critical)
125
+ buffer.store(content: 'normal', priority: :normal)
126
+ candidates = buffer.consolidation_candidates
127
+ expect(candidates.size).to eq(1)
128
+ expect(candidates.first.content).to eq('critical')
129
+ end
130
+ end
131
+
132
+ describe '#current_load' do
133
+ it 'returns 0.0 when empty' do
134
+ expect(buffer.current_load).to eq(0.0)
135
+ end
136
+
137
+ it 'increases as items are added' do
138
+ 3.times { |i| buffer.store(content: "item #{i}") }
139
+ expect(buffer.current_load).to be > 0.0
140
+ end
141
+
142
+ it 'clamps at 1.0' do
143
+ 20.times { |i| buffer.store(content: "item #{i}", priority: :critical) }
144
+ expect(buffer.current_load).to be <= 1.0
145
+ end
146
+ end
147
+
148
+ describe '#load_level' do
149
+ it 'returns :idle when empty' do
150
+ expect(buffer.load_level).to eq(:idle)
151
+ end
152
+
153
+ it 'returns higher levels as buffer fills' do
154
+ # Use unique tags to prevent chunk_bonus inflation
155
+ 20.times { |i| buffer.store(content: "item #{i}", priority: :critical, tags: [:"unique_#{i}"]) }
156
+ expect(buffer.load_level).to eq(:overloaded)
157
+ end
158
+ end
159
+
160
+ describe '#capacity' do
161
+ it 'is at least the base CAPACITY' do
162
+ expect(buffer.capacity).to be >= constants::CAPACITY
163
+ end
164
+
165
+ it 'increases with chunking (items sharing tags)' do
166
+ buffer.store(content: 'a1', tags: [:group_a])
167
+ buffer.store(content: 'a2', tags: [:group_a])
168
+ buffer.store(content: 'b1', tags: [:group_b])
169
+ buffer.store(content: 'b2', tags: [:group_b])
170
+ expect(buffer.capacity).to be > constants::CAPACITY
171
+ end
172
+
173
+ it 'caps chunk bonus at CHUNK_BONUS' do
174
+ 10.times { |i| buffer.store(content: "item #{i}", tags: [:"group_#{i / 2}"]) }
175
+ expect(buffer.capacity).to be <= constants::CAPACITY + constants::CHUNK_BONUS
176
+ end
177
+ end
178
+
179
+ describe '#available_slots' do
180
+ it 'equals capacity when empty' do
181
+ expect(buffer.available_slots).to eq(buffer.capacity)
182
+ end
183
+
184
+ it 'decreases as items are added' do
185
+ buffer.store(content: 'one')
186
+ expect(buffer.available_slots).to eq(buffer.capacity - 1)
187
+ end
188
+
189
+ it 'never goes below zero' do
190
+ 20.times { |i| buffer.store(content: "item #{i}", priority: :critical) }
191
+ expect(buffer.available_slots).to be >= 0
192
+ end
193
+ end
194
+
195
+ describe '#full?' do
196
+ it 'is false when empty' do
197
+ expect(buffer.full?).to be false
198
+ end
199
+
200
+ it 'is true at capacity' do
201
+ # Use unique tags to prevent chunk_bonus inflation (nil first-tag groups all items)
202
+ 20.times { |i| buffer.store(content: "item #{i}", priority: :critical, tags: [:"unique_#{i}"]) }
203
+ expect(buffer.full?).to be true
204
+ end
205
+ end
206
+
207
+ describe '#clear' do
208
+ it 'removes all items' do
209
+ 3.times { |i| buffer.store(content: "item #{i}") }
210
+ buffer.clear
211
+ expect(buffer.size).to eq(0)
212
+ end
213
+ end
214
+
215
+ describe '#to_h' do
216
+ it 'returns a status hash' do
217
+ buffer.store(content: 'test')
218
+ h = buffer.to_h
219
+ expect(h).to include(:size, :capacity, :load, :load_level, :by_type, :available)
220
+ expect(h[:size]).to eq(1)
221
+ end
222
+
223
+ it 'breaks down items by type' do
224
+ buffer.store(content: 'v', buffer_type: :verbal)
225
+ buffer.store(content: 's', buffer_type: :spatial)
226
+ h = buffer.to_h
227
+ expect(h[:by_type][:verbal]).to eq(1)
228
+ expect(h[:by_type][:spatial]).to eq(1)
229
+ expect(h[:by_type][:episodic]).to eq(0)
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::WorkingMemory::Helpers::Constants do
6
+ describe 'CAPACITY' do
7
+ it 'is 7 (Miller\'s Law)' do
8
+ expect(described_class::CAPACITY).to eq(7)
9
+ end
10
+ end
11
+
12
+ describe 'CHUNK_BONUS' do
13
+ it 'is a positive integer' do
14
+ expect(described_class::CHUNK_BONUS).to be_a(Integer)
15
+ expect(described_class::CHUNK_BONUS).to be > 0
16
+ end
17
+ end
18
+
19
+ describe 'BUFFER_TYPES' do
20
+ it 'contains verbal, spatial, and episodic' do
21
+ expect(described_class::BUFFER_TYPES).to contain_exactly(:verbal, :spatial, :episodic)
22
+ end
23
+
24
+ it 'is frozen' do
25
+ expect(described_class::BUFFER_TYPES).to be_frozen
26
+ end
27
+ end
28
+
29
+ describe 'DECAY_RATE' do
30
+ it 'is a positive float between 0 and 1' do
31
+ expect(described_class::DECAY_RATE).to be_a(Float)
32
+ expect(described_class::DECAY_RATE).to be_between(0.0, 1.0).exclusive
33
+ end
34
+ end
35
+
36
+ describe 'REHEARSAL_BOOST' do
37
+ it 'is a positive float between 0 and 1' do
38
+ expect(described_class::REHEARSAL_BOOST).to be_a(Float)
39
+ expect(described_class::REHEARSAL_BOOST).to be_between(0.0, 1.0).exclusive
40
+ end
41
+ end
42
+
43
+ describe 'PRIORITY_LEVELS' do
44
+ it 'has five levels' do
45
+ expect(described_class::PRIORITY_LEVELS.size).to eq(5)
46
+ end
47
+
48
+ it 'is ordered from highest to lowest activation' do
49
+ values = described_class::PRIORITY_LEVELS.values
50
+ expect(values).to eq(values.sort.reverse)
51
+ end
52
+
53
+ it 'has critical at 1.0' do
54
+ expect(described_class::PRIORITY_LEVELS[:critical]).to eq(1.0)
55
+ end
56
+
57
+ it 'is frozen' do
58
+ expect(described_class::PRIORITY_LEVELS).to be_frozen
59
+ end
60
+ end
61
+
62
+ describe 'MAX_AGE_TICKS' do
63
+ it 'is a positive integer' do
64
+ expect(described_class::MAX_AGE_TICKS).to be_a(Integer)
65
+ expect(described_class::MAX_AGE_TICKS).to be > 0
66
+ end
67
+ end
68
+
69
+ describe 'INTERFERENCE_THRESHOLD' do
70
+ it 'is a float between 0 and 1' do
71
+ expect(described_class::INTERFERENCE_THRESHOLD).to be_between(0.0, 1.0)
72
+ end
73
+ end
74
+
75
+ describe 'CONSOLIDATION_THRESHOLD' do
76
+ it 'is a float between 0 and 1' do
77
+ expect(described_class::CONSOLIDATION_THRESHOLD).to be_between(0.0, 1.0)
78
+ end
79
+
80
+ it 'is higher than normal priority activation' do
81
+ expect(described_class::CONSOLIDATION_THRESHOLD).to be > described_class::PRIORITY_LEVELS[:normal]
82
+ end
83
+ end
84
+
85
+ describe 'LOAD_LEVELS' do
86
+ it 'has five levels' do
87
+ expect(described_class::LOAD_LEVELS.size).to eq(5)
88
+ end
89
+
90
+ it 'is ordered from highest to lowest threshold' do
91
+ values = described_class::LOAD_LEVELS.values
92
+ expect(values).to eq(values.sort.reverse)
93
+ end
94
+
95
+ it 'is frozen' do
96
+ expect(described_class::LOAD_LEVELS).to be_frozen
97
+ end
98
+ end
99
+ end