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,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inertia::Helpers::InertiaEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:belief) { engine.form_belief(content: 'test') }
7
+
8
+ describe '#form_belief' do
9
+ it 'returns a Belief' do
10
+ expect(belief).to be_a(Legion::Extensions::Agentic::Executive::Inertia::Helpers::Belief)
11
+ end
12
+
13
+ it 'stores the belief' do
14
+ belief
15
+ expect(engine.to_h[:total_beliefs]).to eq(1)
16
+ end
17
+ end
18
+
19
+ describe '#challenge_belief' do
20
+ it 'returns outcome and belief' do
21
+ result = engine.challenge_belief(belief_id: belief.id, strength: 0.5)
22
+ expect(result[:outcome]).to be_a(Symbol)
23
+ expect(result[:belief]).to be_a(Legion::Extensions::Agentic::Executive::Inertia::Helpers::Belief)
24
+ end
25
+
26
+ it 'returns nil for unknown id' do
27
+ expect(engine.challenge_belief(belief_id: 'fake')).to be_nil
28
+ end
29
+ end
30
+
31
+ describe '#reinforce_belief' do
32
+ it 'increases conviction' do
33
+ original = belief.conviction
34
+ engine.reinforce_belief(belief_id: belief.id)
35
+ expect(belief.conviction).to be > original
36
+ end
37
+ end
38
+
39
+ describe '#entrenched_beliefs' do
40
+ it 'returns only entrenched beliefs' do
41
+ b = engine.form_belief(content: 'strong', conviction: 0.9)
42
+ 10.times { engine.reinforce_belief(belief_id: b.id) }
43
+ expect(engine.entrenched_beliefs).to include(b)
44
+ end
45
+ end
46
+
47
+ describe '#beliefs_by_domain' do
48
+ it 'filters by domain' do
49
+ engine.form_belief(content: 'causal', domain: :causal)
50
+ engine.form_belief(content: 'factual', domain: :factual)
51
+ result = engine.beliefs_by_domain(domain: :causal)
52
+ expect(result.size).to eq(1)
53
+ end
54
+ end
55
+
56
+ describe '#average_inertia' do
57
+ it 'returns default with no beliefs' do
58
+ default = Legion::Extensions::Agentic::Executive::Inertia::Helpers::Constants::DEFAULT_INERTIA
59
+ expect(engine.average_inertia).to eq(default)
60
+ end
61
+ end
62
+
63
+ describe '#overall_flexibility' do
64
+ it 'returns 0.5 with no beliefs' do
65
+ expect(engine.overall_flexibility).to eq(0.5)
66
+ end
67
+
68
+ it 'is inverse of average inertia' do
69
+ belief
70
+ expect(engine.overall_flexibility).to eq((1.0 - engine.average_inertia).round(10))
71
+ end
72
+ end
73
+
74
+ describe '#inertia_report' do
75
+ it 'includes all report fields' do
76
+ belief
77
+ report = engine.inertia_report
78
+ expect(report).to include(
79
+ :total_beliefs, :entrenched_count, :flexible_count,
80
+ :average_inertia, :average_conviction, :overall_flexibility,
81
+ :most_resistant
82
+ )
83
+ end
84
+ end
85
+
86
+ describe '#to_h' do
87
+ it 'includes summary fields' do
88
+ hash = engine.to_h
89
+ expect(hash).to include(
90
+ :total_beliefs, :entrenched_count, :flexible_count,
91
+ :average_inertia, :overall_flexibility
92
+ )
93
+ end
94
+ end
95
+
96
+ describe 'pruning' do
97
+ it 'prunes most flexible belief when limit reached' do
98
+ stub_const('Legion::Extensions::Agentic::Executive::Inertia::Helpers::Constants::MAX_BELIEFS', 3)
99
+ eng = described_class.new
100
+ 4.times { |i| eng.form_belief(content: "b#{i}") }
101
+ expect(eng.to_h[:total_beliefs]).to eq(3)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inertia::Runners::CognitiveInertia do
4
+ let(:client) { Legion::Extensions::Agentic::Executive::Inertia::Client.new }
5
+
6
+ describe '#form_belief' do
7
+ it 'returns success with belief hash' do
8
+ result = client.form_belief(content: 'test')
9
+ expect(result[:success]).to be true
10
+ expect(result[:belief]).to include(:id, :content, :conviction, :inertia)
11
+ end
12
+ end
13
+
14
+ describe '#challenge_belief' do
15
+ it 'returns outcome' do
16
+ b = client.form_belief(content: 'test')
17
+ result = client.challenge_belief(belief_id: b[:belief][:id], strength: 0.5)
18
+ expect(result[:success]).to be true
19
+ expect(result[:outcome]).to be_a(Symbol)
20
+ end
21
+
22
+ it 'returns failure for unknown id' do
23
+ result = client.challenge_belief(belief_id: 'fake')
24
+ expect(result[:success]).to be false
25
+ end
26
+ end
27
+
28
+ describe '#reinforce_belief' do
29
+ it 'returns updated belief' do
30
+ b = client.form_belief(content: 'test')
31
+ result = client.reinforce_belief(belief_id: b[:belief][:id])
32
+ expect(result[:success]).to be true
33
+ end
34
+ end
35
+
36
+ describe '#entrenched_beliefs' do
37
+ it 'returns beliefs array' do
38
+ result = client.entrenched_beliefs
39
+ expect(result[:success]).to be true
40
+ expect(result[:beliefs]).to be_a(Array)
41
+ end
42
+ end
43
+
44
+ describe '#average_inertia' do
45
+ it 'returns inertia score' do
46
+ result = client.average_inertia
47
+ expect(result[:success]).to be true
48
+ expect(result[:inertia]).to be_a(Numeric)
49
+ end
50
+ end
51
+
52
+ describe '#inertia_report' do
53
+ it 'returns a full report' do
54
+ result = client.inertia_report
55
+ expect(result[:success]).to be true
56
+ expect(result[:report]).to include(:total_beliefs, :average_inertia)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inhibition::Client do
6
+ describe '#initialize' do
7
+ it 'creates default inhibition store' do
8
+ client = described_class.new
9
+ expect(client.inhibition_store).to be_a(Legion::Extensions::Agentic::Executive::Inhibition::Helpers::InhibitionStore)
10
+ end
11
+
12
+ it 'accepts injected inhibition store' do
13
+ store = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::InhibitionStore.new
14
+ client = described_class.new(inhibition_store: store)
15
+ expect(client.inhibition_store).to be(store)
16
+ end
17
+
18
+ it 'ignores unknown kwargs' do
19
+ expect { described_class.new(unknown: :value) }.not_to raise_error
20
+ end
21
+ end
22
+
23
+ describe 'runner integration' do
24
+ let(:client) { described_class.new }
25
+
26
+ it { expect(client).to respond_to(:update_inhibition) }
27
+ it { expect(client).to respond_to(:evaluate_impulse) }
28
+ it { expect(client).to respond_to(:delay_gratification) }
29
+ it { expect(client).to respond_to(:check_stroop) }
30
+ it { expect(client).to respond_to(:willpower_status) }
31
+ it { expect(client).to respond_to(:inhibition_history) }
32
+ it { expect(client).to respond_to(:inhibition_stats) }
33
+ end
34
+
35
+ describe 'injected store is used by runner' do
36
+ it 'uses the injected store when evaluating impulses' do
37
+ store = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::InhibitionStore.new
38
+ client = described_class.new(inhibition_store: store)
39
+ client.evaluate_impulse(action: :act, type: :reactive, strength: :mild)
40
+ expect(store.impulses.size).to eq(1)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Constants do
6
+ describe 'IMPULSE_TYPES' do
7
+ it 'defines 5 types' do
8
+ expect(described_class::IMPULSE_TYPES.size).to eq(5)
9
+ end
10
+
11
+ it 'includes reactive' do
12
+ expect(described_class::IMPULSE_TYPES).to include(:reactive)
13
+ end
14
+
15
+ it 'includes emotional' do
16
+ expect(described_class::IMPULSE_TYPES).to include(:emotional)
17
+ end
18
+
19
+ it 'is frozen' do
20
+ expect(described_class::IMPULSE_TYPES).to be_frozen
21
+ end
22
+ end
23
+
24
+ describe 'INHIBITION_STRATEGIES' do
25
+ it 'defines 5 strategies' do
26
+ expect(described_class::INHIBITION_STRATEGIES.size).to eq(5)
27
+ end
28
+
29
+ it 'includes suppression' do
30
+ expect(described_class::INHIBITION_STRATEGIES).to include(:suppression)
31
+ end
32
+
33
+ it 'includes delay' do
34
+ expect(described_class::INHIBITION_STRATEGIES).to include(:delay)
35
+ end
36
+
37
+ it 'is frozen' do
38
+ expect(described_class::INHIBITION_STRATEGIES).to be_frozen
39
+ end
40
+ end
41
+
42
+ describe 'IMPULSE_STRENGTHS' do
43
+ it 'defines 5 strength levels' do
44
+ expect(described_class::IMPULSE_STRENGTHS.size).to eq(5)
45
+ end
46
+
47
+ it 'has overwhelming at 1.0' do
48
+ expect(described_class::IMPULSE_STRENGTHS[:overwhelming]).to eq(1.0)
49
+ end
50
+
51
+ it 'has negligible as the lowest' do
52
+ expect(described_class::IMPULSE_STRENGTHS[:negligible]).to eq(0.1)
53
+ end
54
+
55
+ it 'has values in descending order' do
56
+ values = described_class::IMPULSE_STRENGTHS.values
57
+ expect(values).to eq(values.sort.reverse)
58
+ end
59
+
60
+ it 'is frozen' do
61
+ expect(described_class::IMPULSE_STRENGTHS).to be_frozen
62
+ end
63
+ end
64
+
65
+ describe 'numeric constants' do
66
+ it 'defines INHIBITION_ALPHA' do
67
+ expect(described_class::INHIBITION_ALPHA).to eq(0.12)
68
+ end
69
+
70
+ it 'defines FATIGUE_PER_INHIBITION' do
71
+ expect(described_class::FATIGUE_PER_INHIBITION).to eq(0.05)
72
+ end
73
+
74
+ it 'defines FATIGUE_RECOVERY_RATE' do
75
+ expect(described_class::FATIGUE_RECOVERY_RATE).to eq(0.02)
76
+ end
77
+
78
+ it 'defines MAX_INHIBITION_LOG' do
79
+ expect(described_class::MAX_INHIBITION_LOG).to eq(200)
80
+ end
81
+
82
+ it 'defines WILLPOWER_THRESHOLD' do
83
+ expect(described_class::WILLPOWER_THRESHOLD).to eq(0.3)
84
+ end
85
+
86
+ it 'defines AUTOMATIC_SUPPRESS_THRESHOLD' do
87
+ expect(described_class::AUTOMATIC_SUPPRESS_THRESHOLD).to eq(0.2)
88
+ end
89
+
90
+ it 'defines DELAY_DISCOUNT_RATE' do
91
+ expect(described_class::DELAY_DISCOUNT_RATE).to eq(0.1)
92
+ end
93
+
94
+ it 'defines STROOP_CONFLICT_THRESHOLD' do
95
+ expect(described_class::STROOP_CONFLICT_THRESHOLD).to eq(0.6)
96
+ end
97
+ end
98
+
99
+ describe 'threshold relationships' do
100
+ it 'has AUTOMATIC_SUPPRESS below WILLPOWER_THRESHOLD' do
101
+ expect(described_class::AUTOMATIC_SUPPRESS_THRESHOLD).to be < described_class::WILLPOWER_THRESHOLD
102
+ end
103
+
104
+ it 'has WILLPOWER_THRESHOLD below 1.0' do
105
+ expect(described_class::WILLPOWER_THRESHOLD).to be < 1.0
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse do
6
+ subject(:impulse) do
7
+ described_class.new(type: :reactive, action: :send_message, strength: 0.5)
8
+ end
9
+
10
+ describe '#initialize' do
11
+ it 'assigns a uuid id' do
12
+ expect(impulse.id).to match(/\A[0-9a-f-]{36}\z/)
13
+ end
14
+
15
+ it 'assigns type' do
16
+ expect(impulse.type).to eq(:reactive)
17
+ end
18
+
19
+ it 'assigns action' do
20
+ expect(impulse.action).to eq(:send_message)
21
+ end
22
+
23
+ it 'assigns strength' do
24
+ expect(impulse.strength).to eq(0.5)
25
+ end
26
+
27
+ it 'defaults source to nil' do
28
+ expect(impulse.source).to be_nil
29
+ end
30
+
31
+ it 'defaults context to empty hash' do
32
+ expect(impulse.context).to eq({})
33
+ end
34
+
35
+ it 'sets created_at' do
36
+ expect(impulse.created_at).to be_a(Time)
37
+ end
38
+
39
+ it 'accepts optional source' do
40
+ i = described_class.new(type: :emotional, action: :speak, strength: 0.3, source: :tick)
41
+ expect(i.source).to eq(:tick)
42
+ end
43
+
44
+ it 'accepts optional context' do
45
+ i = described_class.new(type: :social, action: :reply, strength: 0.4, context: { trigger: :mention })
46
+ expect(i.context[:trigger]).to eq(:mention)
47
+ end
48
+ end
49
+
50
+ describe '#overwhelming?' do
51
+ it 'returns true when strength >= 0.75' do
52
+ i = described_class.new(type: :reactive, action: :act, strength: 0.75)
53
+ expect(i.overwhelming?).to be true
54
+ end
55
+
56
+ it 'returns true for 1.0' do
57
+ i = described_class.new(type: :reactive, action: :act, strength: 1.0)
58
+ expect(i.overwhelming?).to be true
59
+ end
60
+
61
+ it 'returns false for moderate strength' do
62
+ i = described_class.new(type: :reactive, action: :act, strength: 0.5)
63
+ expect(i.overwhelming?).to be false
64
+ end
65
+
66
+ it 'returns false for mild strength' do
67
+ i = described_class.new(type: :reactive, action: :act, strength: 0.25)
68
+ expect(i.overwhelming?).to be false
69
+ end
70
+ end
71
+
72
+ describe '#auto_suppressible?' do
73
+ it 'returns true when strength <= 0.2' do
74
+ i = described_class.new(type: :reactive, action: :act, strength: 0.1)
75
+ expect(i.auto_suppressible?).to be true
76
+ end
77
+
78
+ it 'returns true at exactly 0.2' do
79
+ i = described_class.new(type: :reactive, action: :act, strength: 0.2)
80
+ expect(i.auto_suppressible?).to be true
81
+ end
82
+
83
+ it 'returns false for moderate strength' do
84
+ i = described_class.new(type: :reactive, action: :act, strength: 0.5)
85
+ expect(i.auto_suppressible?).to be false
86
+ end
87
+
88
+ it 'returns false for strong strength' do
89
+ i = described_class.new(type: :reactive, action: :act, strength: 0.8)
90
+ expect(i.auto_suppressible?).to be false
91
+ end
92
+ end
93
+
94
+ describe 'unique ids' do
95
+ it 'generates different ids for different instances' do
96
+ i1 = described_class.new(type: :reactive, action: :act, strength: 0.5)
97
+ i2 = described_class.new(type: :reactive, action: :act, strength: 0.5)
98
+ expect(i1.id).not_to eq(i2.id)
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,245 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::Inhibition::Helpers::InhibitionModel do
6
+ subject(:model) { described_class.new }
7
+
8
+ let(:mild_impulse) do
9
+ Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
10
+ type: :reactive, action: :act, strength: 0.25
11
+ )
12
+ end
13
+
14
+ let(:negligible_impulse) do
15
+ Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
16
+ type: :reactive, action: :act, strength: 0.1
17
+ )
18
+ end
19
+
20
+ let(:strong_impulse) do
21
+ Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
22
+ type: :emotional, action: :react, strength: 0.8
23
+ )
24
+ end
25
+
26
+ describe '#initialize' do
27
+ it 'starts willpower at 0.8' do
28
+ expect(model.willpower).to eq(0.8)
29
+ end
30
+
31
+ it 'starts with empty inhibition log' do
32
+ expect(model.inhibition_log).to be_empty
33
+ end
34
+
35
+ it 'starts suppressed count at 0' do
36
+ expect(model.suppressed_count).to eq(0)
37
+ end
38
+
39
+ it 'starts failed count at 0' do
40
+ expect(model.failed_count).to eq(0)
41
+ end
42
+
43
+ it 'starts redirected count at 0' do
44
+ expect(model.redirected_count).to eq(0)
45
+ end
46
+ end
47
+
48
+ describe '#evaluate_impulse' do
49
+ it 'returns :auto_suppress for auto-suppressible impulses' do
50
+ expect(model.evaluate_impulse(negligible_impulse)).to eq(:auto_suppress)
51
+ end
52
+
53
+ it 'returns :failed when willpower is exhausted' do
54
+ model.instance_variable_set(:@willpower, 0.1)
55
+ expect(model.evaluate_impulse(mild_impulse)).to eq(:failed)
56
+ end
57
+
58
+ it 'returns a valid strategy for normal impulses' do
59
+ strategies = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Constants::INHIBITION_STRATEGIES + %i[auto_suppress failed]
60
+ expect(strategies).to include(model.evaluate_impulse(mild_impulse))
61
+ end
62
+
63
+ it 'selects :redirect for habitual type' do
64
+ habitual = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
65
+ type: :habitual, action: :routine, strength: 0.5
66
+ )
67
+ expect(model.evaluate_impulse(habitual)).to eq(:redirect)
68
+ end
69
+
70
+ it 'selects :delay for overwhelming emotional impulse' do
71
+ overwhelming = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
72
+ type: :emotional, action: :react, strength: 0.9
73
+ )
74
+ expect(model.evaluate_impulse(overwhelming)).to eq(:delay)
75
+ end
76
+
77
+ it 'selects :suppression for non-overwhelming emotional impulse' do
78
+ moderate_emotional = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
79
+ type: :emotional, action: :react, strength: 0.4
80
+ )
81
+ expect(model.evaluate_impulse(moderate_emotional)).to eq(:suppression)
82
+ end
83
+
84
+ it 'selects :substitute for social impulse' do
85
+ social = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
86
+ type: :social, action: :conform, strength: 0.5
87
+ )
88
+ expect(model.evaluate_impulse(social)).to eq(:substitute)
89
+ end
90
+
91
+ it 'selects :defer for competitive impulse' do
92
+ competitive = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
93
+ type: :competitive, action: :escalate, strength: 0.5
94
+ )
95
+ expect(model.evaluate_impulse(competitive)).to eq(:defer)
96
+ end
97
+
98
+ it 'selects :suppression for reactive impulse' do
99
+ reactive = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
100
+ type: :reactive, action: :react, strength: 0.5
101
+ )
102
+ expect(model.evaluate_impulse(reactive)).to eq(:suppression)
103
+ end
104
+ end
105
+
106
+ describe '#apply_strategy' do
107
+ it 'returns a log entry hash' do
108
+ entry = model.apply_strategy(mild_impulse, :suppression)
109
+ expect(entry).to include(:impulse_id, :type, :action, :strength, :strategy, :willpower, :at)
110
+ end
111
+
112
+ it 'increments suppressed_count for suppression' do
113
+ model.apply_strategy(mild_impulse, :suppression)
114
+ expect(model.suppressed_count).to eq(1)
115
+ end
116
+
117
+ it 'increments failed_count for failed' do
118
+ model.apply_strategy(mild_impulse, :failed)
119
+ expect(model.failed_count).to eq(1)
120
+ end
121
+
122
+ it 'increments both redirected and suppressed for redirect' do
123
+ model.apply_strategy(mild_impulse, :redirect)
124
+ expect(model.redirected_count).to eq(1)
125
+ expect(model.suppressed_count).to eq(1)
126
+ end
127
+
128
+ it 'does not deplete willpower for auto_suppress' do
129
+ initial = model.willpower
130
+ model.apply_strategy(negligible_impulse, :auto_suppress)
131
+ expect(model.willpower).to eq(initial)
132
+ end
133
+
134
+ it 'depletes willpower for active strategies' do
135
+ initial = model.willpower
136
+ model.apply_strategy(strong_impulse, :suppression)
137
+ expect(model.willpower).to be < initial
138
+ end
139
+
140
+ it 'logs the entry' do
141
+ model.apply_strategy(mild_impulse, :suppression)
142
+ expect(model.inhibition_log.size).to eq(1)
143
+ end
144
+
145
+ it 'caps the log at MAX_INHIBITION_LOG' do
146
+ max = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Constants::MAX_INHIBITION_LOG
147
+ (max + 10).times do
148
+ imp = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Impulse.new(
149
+ type: :reactive, action: :act, strength: 0.25
150
+ )
151
+ model.apply_strategy(imp, :suppression)
152
+ end
153
+ expect(model.inhibition_log.size).to eq(max)
154
+ end
155
+ end
156
+
157
+ describe '#recover_willpower' do
158
+ it 'increases willpower by FATIGUE_RECOVERY_RATE' do
159
+ model.instance_variable_set(:@willpower, 0.5)
160
+ model.recover_willpower
161
+ expect(model.willpower).to be_within(0.001).of(0.52)
162
+ end
163
+
164
+ it 'caps at 1.0' do
165
+ model.instance_variable_set(:@willpower, 0.99)
166
+ model.recover_willpower
167
+ expect(model.willpower).to eq(1.0)
168
+ end
169
+ end
170
+
171
+ describe '#willpower_status' do
172
+ it 'returns :healthy when willpower >= 0.6' do
173
+ model.instance_variable_set(:@willpower, 0.7)
174
+ expect(model.willpower_status).to eq(:healthy)
175
+ end
176
+
177
+ it 'returns :depleted when willpower is between threshold and 0.6' do
178
+ model.instance_variable_set(:@willpower, 0.4)
179
+ expect(model.willpower_status).to eq(:depleted)
180
+ end
181
+
182
+ it 'returns :exhausted when willpower is below threshold' do
183
+ model.instance_variable_set(:@willpower, 0.1)
184
+ expect(model.willpower_status).to eq(:exhausted)
185
+ end
186
+ end
187
+
188
+ describe '#success_rate' do
189
+ it 'returns 1.0 with no attempts' do
190
+ expect(model.success_rate).to eq(1.0)
191
+ end
192
+
193
+ it 'returns ratio of suppressed to total' do
194
+ model.apply_strategy(mild_impulse, :suppression)
195
+ model.apply_strategy(mild_impulse, :failed)
196
+ expect(model.success_rate).to eq(0.5)
197
+ end
198
+
199
+ it 'returns 0.0 when all failed' do
200
+ 3.times { model.apply_strategy(mild_impulse, :failed) }
201
+ expect(model.success_rate).to eq(0.0)
202
+ end
203
+ end
204
+
205
+ describe '#delay_discount' do
206
+ it 'returns full value at zero delay' do
207
+ expect(model.delay_discount(100.0, 0)).to eq(100.0)
208
+ end
209
+
210
+ it 'reduces value with delay' do
211
+ discounted = model.delay_discount(100.0, 5)
212
+ expect(discounted).to be < 100.0
213
+ end
214
+
215
+ it 'reduces value more with longer delay' do
216
+ short = model.delay_discount(100.0, 5)
217
+ long = model.delay_discount(100.0, 20)
218
+ expect(long).to be < short
219
+ end
220
+
221
+ it 'uses DELAY_DISCOUNT_RATE' do
222
+ rate = Legion::Extensions::Agentic::Executive::Inhibition::Helpers::Constants::DELAY_DISCOUNT_RATE
223
+ expected = 100.0 / (1.0 + (rate * 10))
224
+ expect(model.delay_discount(100.0, 10)).to be_within(0.001).of(expected)
225
+ end
226
+ end
227
+
228
+ describe '#stroop_conflict?' do
229
+ it 'returns false when responses match' do
230
+ expect(model.stroop_conflict?(:respond, :respond)).to be false
231
+ end
232
+
233
+ it 'returns true when responses differ and automatic is strong' do
234
+ automatic = { strength: 0.8 }
235
+ controlled = { strength: 0.4 }
236
+ expect(model.stroop_conflict?(automatic, controlled)).to be true
237
+ end
238
+
239
+ it 'returns false when automatic strength is below threshold' do
240
+ automatic = { strength: 0.3 }
241
+ controlled = { strength: 0.7 }
242
+ expect(model.stroop_conflict?(automatic, controlled)).to be false
243
+ end
244
+ end
245
+ end