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,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Heuristic do
4
+ let(:heuristic) do
5
+ described_class.new(pattern: 'greeting', domain: :social, response: :wave)
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'assigns a uuid id' do
10
+ expect(heuristic.id).to match(/\A[0-9a-f-]{36}\z/)
11
+ end
12
+
13
+ it 'stores pattern, domain, and response' do
14
+ expect(heuristic.pattern).to eq('greeting')
15
+ expect(heuristic.domain).to eq(:social)
16
+ expect(heuristic.response).to eq(:wave)
17
+ end
18
+
19
+ it 'defaults confidence to DEFAULT_CONFIDENCE' do
20
+ expect(heuristic.confidence).to eq(Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::DEFAULT_CONFIDENCE)
21
+ end
22
+
23
+ it 'accepts custom confidence' do
24
+ h = described_class.new(pattern: :x, domain: :d, response: :r, confidence: 0.8)
25
+ expect(h.confidence).to eq(0.8)
26
+ end
27
+
28
+ it 'clamps confidence to floor' do
29
+ h = described_class.new(pattern: :x, domain: :d, response: :r, confidence: -1.0)
30
+ expect(h.confidence).to eq(Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::CONFIDENCE_FLOOR)
31
+ end
32
+
33
+ it 'clamps confidence to ceiling' do
34
+ h = described_class.new(pattern: :x, domain: :d, response: :r, confidence: 2.0)
35
+ expect(h.confidence).to eq(Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::CONFIDENCE_CEILING)
36
+ end
37
+
38
+ it 'starts with zero use_count and success_count' do
39
+ expect(heuristic.use_count).to eq(0)
40
+ expect(heuristic.success_count).to eq(0)
41
+ end
42
+
43
+ it 'sets created_at' do
44
+ expect(heuristic.created_at).to be_a(Time)
45
+ end
46
+
47
+ it 'starts with nil last_used_at' do
48
+ expect(heuristic.last_used_at).to be_nil
49
+ end
50
+ end
51
+
52
+ describe '#use!' do
53
+ it 'increments use_count' do
54
+ heuristic.use!(success: true)
55
+ expect(heuristic.use_count).to eq(1)
56
+ end
57
+
58
+ it 'increments success_count on success' do
59
+ heuristic.use!(success: true)
60
+ expect(heuristic.success_count).to eq(1)
61
+ end
62
+
63
+ it 'does not increment success_count on failure' do
64
+ heuristic.use!(success: false)
65
+ expect(heuristic.success_count).to eq(0)
66
+ end
67
+
68
+ it 'sets last_used_at' do
69
+ heuristic.use!(success: true)
70
+ expect(heuristic.last_used_at).to be_a(Time)
71
+ end
72
+
73
+ it 'boosts confidence on success' do
74
+ original = heuristic.confidence
75
+ heuristic.use!(success: true)
76
+ expect(heuristic.confidence).to be > original
77
+ end
78
+
79
+ it 'reduces confidence on failure' do
80
+ original = heuristic.confidence
81
+ heuristic.use!(success: false)
82
+ expect(heuristic.confidence).to be < original
83
+ end
84
+
85
+ it 'does not exceed CONFIDENCE_CEILING' do
86
+ 10.times { heuristic.use!(success: true) }
87
+ expect(heuristic.confidence).to be <= Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::CONFIDENCE_CEILING
88
+ end
89
+
90
+ it 'does not go below CONFIDENCE_FLOOR' do
91
+ 10.times { heuristic.use!(success: false) }
92
+ expect(heuristic.confidence).to be >= Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::CONFIDENCE_FLOOR
93
+ end
94
+ end
95
+
96
+ describe '#success_rate' do
97
+ it 'returns 0.0 with no uses' do
98
+ expect(heuristic.success_rate).to eq(0.0)
99
+ end
100
+
101
+ it 'computes ratio correctly' do
102
+ 2.times { heuristic.use!(success: true) }
103
+ heuristic.use!(success: false)
104
+ expect(heuristic.success_rate).to be_within(0.001).of(2.0 / 3.0)
105
+ end
106
+ end
107
+
108
+ describe '#reliable?' do
109
+ it 'returns false with no uses' do
110
+ expect(heuristic.reliable?).to be false
111
+ end
112
+
113
+ it 'returns false with fewer than 3 uses' do
114
+ 2.times { heuristic.use!(success: true) }
115
+ expect(heuristic.reliable?).to be false
116
+ end
117
+
118
+ it 'returns true with high success rate and enough uses' do
119
+ 5.times { heuristic.use!(success: true) }
120
+ expect(heuristic.reliable?).to be true
121
+ end
122
+
123
+ it 'returns false with low success rate even with many uses' do
124
+ 5.times { heuristic.use!(success: false) }
125
+ expect(heuristic.reliable?).to be false
126
+ end
127
+ end
128
+
129
+ describe '#to_h' do
130
+ it 'includes all key fields' do
131
+ result = heuristic.to_h
132
+ expect(result).to include(:id, :pattern, :domain, :response, :confidence,
133
+ :use_count, :success_count, :success_rate, :reliable,
134
+ :created_at, :last_used_at)
135
+ end
136
+
137
+ it 'reflects current state' do
138
+ heuristic.use!(success: true)
139
+ result = heuristic.to_h
140
+ expect(result[:use_count]).to eq(1)
141
+ expect(result[:success_count]).to eq(1)
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/executive/dual_process/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::DualProcess::Runners::DualProcess do
6
+ let(:client) { Legion::Extensions::Agentic::Executive::DualProcess::Client.new }
7
+
8
+ describe '#register_heuristic' do
9
+ it 'returns success: true' do
10
+ result = client.register_heuristic(pattern: 'hello', domain: :social, response: :wave)
11
+ expect(result[:success]).to be true
12
+ end
13
+
14
+ it 'returns heuristic data' do
15
+ result = client.register_heuristic(pattern: 'hello', domain: :social, response: :wave)
16
+ expect(result[:heuristic]).to include(:id, :pattern, :domain, :response, :confidence)
17
+ end
18
+
19
+ it 'accepts custom confidence' do
20
+ result = client.register_heuristic(pattern: :x, domain: :d, response: :r, confidence: 0.9)
21
+ expect(result[:heuristic][:confidence]).to eq(0.9)
22
+ end
23
+
24
+ it 'ignores nil confidence and uses default' do
25
+ result = client.register_heuristic(pattern: :x, domain: :d, response: :r, confidence: nil)
26
+ expect(result[:heuristic][:confidence]).to eq(Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::DEFAULT_CONFIDENCE)
27
+ end
28
+ end
29
+
30
+ describe '#route_decision' do
31
+ it 'returns success: true' do
32
+ result = client.route_decision(query: 'test', domain: :work, complexity: 0.3)
33
+ expect(result[:success]).to be true
34
+ end
35
+
36
+ it 'returns a system key' do
37
+ result = client.route_decision(query: 'test', domain: :work, complexity: 0.3)
38
+ expect(Legion::Extensions::Agentic::Executive::DualProcess::Helpers::Constants::SYSTEMS).to include(result[:system])
39
+ end
40
+
41
+ it 'returns a reason' do
42
+ result = client.route_decision(query: 'test', domain: :work, complexity: 0.3)
43
+ expect(result[:reason]).not_to be_nil
44
+ end
45
+ end
46
+
47
+ describe '#execute_system_one' do
48
+ it 'returns success: true' do
49
+ result = client.execute_system_one(query: 'test', domain: :work)
50
+ expect(result[:success]).to be true
51
+ end
52
+
53
+ it 'returns system: :system_one' do
54
+ result = client.execute_system_one(query: 'test', domain: :work)
55
+ expect(result[:system]).to eq(:system_one)
56
+ end
57
+
58
+ it 'returns a decision_id' do
59
+ result = client.execute_system_one(query: 'test', domain: :work)
60
+ expect(result[:decision_id]).to match(/\A[0-9a-f-]{36}\z/)
61
+ end
62
+ end
63
+
64
+ describe '#execute_system_two' do
65
+ it 'returns success: true' do
66
+ result = client.execute_system_two(query: 'complex', domain: :work)
67
+ expect(result[:success]).to be true
68
+ end
69
+
70
+ it 'returns system: :system_two' do
71
+ result = client.execute_system_two(query: 'complex', domain: :work)
72
+ expect(result[:system]).to eq(:system_two)
73
+ end
74
+
75
+ it 'returns a decision_id' do
76
+ result = client.execute_system_two(query: 'complex', domain: :work)
77
+ expect(result[:decision_id]).to match(/\A[0-9a-f-]{36}\z/)
78
+ end
79
+
80
+ it 'accepts deliberation context' do
81
+ result = client.execute_system_two(
82
+ query: 'complex', domain: :work,
83
+ deliberation: { confidence: 0.9, response: :approved }
84
+ )
85
+ expect(result[:confidence]).to eq(0.9)
86
+ expect(result[:response]).to eq(:approved)
87
+ end
88
+ end
89
+
90
+ describe '#record_decision_outcome' do
91
+ it 'returns success for known decision' do
92
+ exec = client.execute_system_one(query: 'x', domain: :d)
93
+ result = client.record_decision_outcome(decision_id: exec[:decision_id], outcome: :correct)
94
+ expect(result[:success]).to be true
95
+ end
96
+
97
+ it 'returns failure for unknown decision' do
98
+ result = client.record_decision_outcome(decision_id: 'bogus-id', outcome: :correct)
99
+ expect(result[:success]).to be false
100
+ end
101
+ end
102
+
103
+ describe '#effort_assessment' do
104
+ it 'returns success: true' do
105
+ result = client.effort_assessment
106
+ expect(result[:success]).to be true
107
+ end
108
+
109
+ it 'includes effort_level' do
110
+ result = client.effort_assessment
111
+ expect(result[:effort_level]).to be_between(0.0, 1.0)
112
+ end
113
+
114
+ it 'includes routing_label' do
115
+ result = client.effort_assessment
116
+ expect(result[:routing_label]).to be_a(Symbol)
117
+ end
118
+ end
119
+
120
+ describe '#best_heuristics' do
121
+ it 'returns success: true' do
122
+ result = client.best_heuristics
123
+ expect(result[:success]).to be true
124
+ end
125
+
126
+ it 'returns heuristics array' do
127
+ result = client.best_heuristics
128
+ expect(result[:heuristics]).to be_an(Array)
129
+ end
130
+
131
+ it 'respects custom limit' do
132
+ 5.times do |i|
133
+ client.register_heuristic(pattern: "p#{i}", domain: :d, response: :r, confidence: 0.9)
134
+ end
135
+ engine = client.send(:engine)
136
+ engine.instance_variable_get(:@heuristics).each_value do |h|
137
+ 5.times { h.use!(success: true) }
138
+ end
139
+ result = client.best_heuristics(limit: 2)
140
+ expect(result[:heuristics].size).to be <= 2
141
+ end
142
+ end
143
+
144
+ describe '#system_usage_stats' do
145
+ it 'returns success: true' do
146
+ result = client.system_usage_stats
147
+ expect(result[:success]).to be true
148
+ end
149
+
150
+ it 'includes stats hash' do
151
+ result = client.system_usage_stats
152
+ expect(result[:stats]).to include(:system_one, :system_two, :total)
153
+ end
154
+ end
155
+
156
+ describe '#update_dual_process' do
157
+ it 'returns success: true' do
158
+ result = client.update_dual_process
159
+ expect(result[:success]).to be true
160
+ end
161
+
162
+ it 'recovers effort' do
163
+ client.execute_system_two(query: 'x', domain: :d)
164
+ before = client.effort_assessment[:effort_level]
165
+ client.update_dual_process
166
+ after = client.effort_assessment[:effort_level]
167
+ expect(after).to be >= before
168
+ end
169
+
170
+ it 'returns routing_label' do
171
+ result = client.update_dual_process
172
+ expect(result[:routing_label]).to be_a(Symbol)
173
+ end
174
+ end
175
+
176
+ describe '#dual_process_stats' do
177
+ it 'returns success: true' do
178
+ result = client.dual_process_stats
179
+ expect(result[:success]).to be true
180
+ end
181
+
182
+ it 'includes full stats' do
183
+ result = client.dual_process_stats
184
+ expect(result).to include(:effort_budget, :effort_level, :routing_label,
185
+ :heuristic_count, :decision_count, :system_stats)
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::Dwell do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Executive::Dwell::VERSION).to eq('0.1.0')
6
+ end
7
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::Dwell::Helpers::DwellEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:problem) { engine.add_topic(content: 'hard bug', topic_type: :problem, salience: 0.8, emotional_intensity: 0.6) }
7
+ let(:idea) { engine.add_topic(content: 'new feature', topic_type: :concept, novelty: 0.9) }
8
+
9
+ describe '#add_topic' do
10
+ it 'creates a dwell topic' do
11
+ topic = engine.add_topic(content: 'test')
12
+ expect(topic).to be_a(Legion::Extensions::Agentic::Executive::Dwell::Helpers::DwellTopic)
13
+ end
14
+ end
15
+
16
+ describe '#focus_on' do
17
+ it 'engages the topic' do
18
+ original = problem.dwell_level
19
+ engine.focus_on(topic_id: problem.id)
20
+ expect(problem.dwell_level).to be > original
21
+ end
22
+
23
+ it 'sets current topic' do
24
+ engine.focus_on(topic_id: problem.id)
25
+ expect(engine.current_topic.id).to eq(problem.id)
26
+ end
27
+
28
+ it 'returns nil for unknown topic' do
29
+ expect(engine.focus_on(topic_id: 'bad')).to be_nil
30
+ end
31
+ end
32
+
33
+ describe '#disengage' do
34
+ it 'reduces dwell level' do
35
+ engine.focus_on(topic_id: problem.id)
36
+ original = problem.dwell_level
37
+ engine.disengage(topic_id: problem.id)
38
+ expect(problem.dwell_level).to be < original
39
+ end
40
+
41
+ it 'clears current topic' do
42
+ engine.focus_on(topic_id: problem.id)
43
+ engine.disengage(topic_id: problem.id)
44
+ expect(engine.current_topic).to be_nil
45
+ end
46
+
47
+ it 'returns nil for unknown topic' do
48
+ expect(engine.disengage(topic_id: 'bad')).to be_nil
49
+ end
50
+ end
51
+
52
+ describe '#decay_all!' do
53
+ it 'decays all topics' do
54
+ original = problem.dwell_level
55
+ engine.decay_all!
56
+ expect(problem.dwell_level).to be < original
57
+ end
58
+ end
59
+
60
+ describe '#current_topic' do
61
+ it 'returns nil initially' do
62
+ expect(engine.current_topic).to be_nil
63
+ end
64
+ end
65
+
66
+ describe '#sticky_topics' do
67
+ it 'returns topics with high dwell' do
68
+ high = engine.add_topic(content: 'crisis', salience: 0.9, novelty: 0.9,
69
+ emotional_intensity: 0.9, complexity: 0.9)
70
+ 3.times { engine.focus_on(topic_id: high.id) }
71
+ expect(engine.sticky_topics.map(&:id)).to include(high.id)
72
+ end
73
+ end
74
+
75
+ describe '#fleeting_topics' do
76
+ it 'returns heavily decayed topics' do
77
+ topic = engine.add_topic(content: 'minor thing', salience: 0.1, novelty: 0.1,
78
+ emotional_intensity: 0.0, complexity: 0.1)
79
+ 8.times { topic.decay! }
80
+ expect(engine.fleeting_topics.map(&:id)).to include(topic.id)
81
+ end
82
+ end
83
+
84
+ describe '#most_engaging' do
85
+ it 'returns topics sorted by dwell level' do
86
+ problem
87
+ idea
88
+ top = engine.most_engaging(limit: 1)
89
+ expect(top.size).to eq(1)
90
+ end
91
+ end
92
+
93
+ describe '#hardest_to_disengage' do
94
+ it 'returns topics sorted by difficulty' do
95
+ problem
96
+ idea
97
+ hard = engine.hardest_to_disengage(limit: 1)
98
+ expect(hard.size).to eq(1)
99
+ end
100
+ end
101
+
102
+ describe '#average_dwell' do
103
+ it 'returns base with no topics' do
104
+ base = Legion::Extensions::Agentic::Executive::Dwell::Helpers::Constants::BASE_DWELL
105
+ expect(engine.average_dwell).to eq(base)
106
+ end
107
+
108
+ it 'computes average' do
109
+ problem
110
+ idea
111
+ expect(engine.average_dwell).to be > 0
112
+ end
113
+ end
114
+
115
+ describe '#dwell_report' do
116
+ it 'returns comprehensive report' do
117
+ problem
118
+ report = engine.dwell_report
119
+ expect(report).to include(
120
+ :total_topics, :current_topic, :sticky_count, :fleeting_count,
121
+ :ruminating_count, :average_dwell, :average_disengagement_difficulty,
122
+ :most_engaging
123
+ )
124
+ end
125
+ end
126
+
127
+ describe '#to_h' do
128
+ it 'returns summary hash' do
129
+ hash = engine.to_h
130
+ expect(hash).to include(
131
+ :total_topics, :current_topic_id, :sticky_count,
132
+ :ruminating_count, :average_dwell
133
+ )
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Executive::Dwell::Helpers::DwellTopic do
4
+ subject(:topic) { described_class.new(content: 'test problem') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(topic.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets content' do
12
+ expect(topic.content).to eq('test problem')
13
+ end
14
+
15
+ it 'defaults to concept type' do
16
+ expect(topic.topic_type).to eq(:concept)
17
+ end
18
+
19
+ it 'computes initial dwell from weighted factors' do
20
+ expect(topic.dwell_level).to be > 0.0
21
+ expect(topic.dwell_level).to be <= 1.0
22
+ end
23
+
24
+ it 'high inputs produce higher dwell' do
25
+ high = described_class.new(content: 'x', salience: 0.9, novelty: 0.9,
26
+ emotional_intensity: 0.9, complexity: 0.9)
27
+ expect(high.dwell_level).to be > topic.dwell_level
28
+ end
29
+
30
+ it 'clamps values' do
31
+ high = described_class.new(content: 'x', salience: 5.0)
32
+ expect(high.salience).to eq(1.0)
33
+ end
34
+ end
35
+
36
+ describe '#engage!' do
37
+ it 'increases dwell level' do
38
+ original = topic.dwell_level
39
+ topic.engage!
40
+ expect(topic.dwell_level).to be > original
41
+ end
42
+
43
+ it 'increments engagement count' do
44
+ topic.engage!
45
+ expect(topic.engagement_count).to eq(1)
46
+ end
47
+
48
+ it 'clamps at 1.0' do
49
+ 15.times { topic.engage! }
50
+ expect(topic.dwell_level).to eq(1.0)
51
+ end
52
+ end
53
+
54
+ describe '#decay!' do
55
+ it 'reduces dwell level' do
56
+ original = topic.dwell_level
57
+ topic.decay!
58
+ expect(topic.dwell_level).to be < original
59
+ end
60
+
61
+ it 'reduces novelty' do
62
+ original = topic.novelty
63
+ topic.decay!
64
+ expect(topic.novelty).to be < original
65
+ end
66
+ end
67
+
68
+ describe '#disengage!' do
69
+ it 'reduces dwell level' do
70
+ original = topic.dwell_level
71
+ topic.disengage!
72
+ expect(topic.dwell_level).to be < original
73
+ end
74
+
75
+ it 'reduces more with force' do
76
+ t1 = described_class.new(content: 'a', salience: 0.8, emotional_intensity: 0.8)
77
+ t2 = described_class.new(content: 'b', salience: 0.8, emotional_intensity: 0.8)
78
+ t1.disengage!(force: 0.0)
79
+ t2.disengage!(force: 0.5)
80
+ expect(t2.dwell_level).to be < t1.dwell_level
81
+ end
82
+ end
83
+
84
+ describe '#sticky?' do
85
+ it 'is false for low-input topic' do
86
+ low = described_class.new(content: 'x', salience: 0.1, novelty: 0.1,
87
+ emotional_intensity: 0.0, complexity: 0.1)
88
+ expect(low.sticky?).to be false
89
+ end
90
+
91
+ it 'is true for high-input topic' do
92
+ high = described_class.new(content: 'x', salience: 0.9, novelty: 0.9,
93
+ emotional_intensity: 0.9, complexity: 0.9)
94
+ expect(high.sticky?).to be true
95
+ end
96
+ end
97
+
98
+ describe '#fleeting?' do
99
+ it 'is false at moderate levels' do
100
+ expect(topic.fleeting?).to be false
101
+ end
102
+
103
+ it 'is true after heavy decay on low topic' do
104
+ low = described_class.new(content: 'x', salience: 0.1, novelty: 0.1,
105
+ emotional_intensity: 0.0, complexity: 0.1)
106
+ 5.times { low.decay! }
107
+ expect(low.fleeting?).to be true
108
+ end
109
+ end
110
+
111
+ describe '#ruminating?' do
112
+ it 'is false normally' do
113
+ expect(topic.ruminating?).to be false
114
+ end
115
+ end
116
+
117
+ describe '#disengagement_difficulty' do
118
+ it 'returns a value between 0 and 1' do
119
+ expect(topic.disengagement_difficulty).to be_between(0.0, 1.0)
120
+ end
121
+
122
+ it 'is higher with high emotion' do
123
+ emotional = described_class.new(content: 'x', emotional_intensity: 0.9)
124
+ calm = described_class.new(content: 'y', emotional_intensity: 0.1)
125
+ expect(emotional.disengagement_difficulty).to be > calm.disengagement_difficulty
126
+ end
127
+ end
128
+
129
+ describe '#dwell_label' do
130
+ it 'returns a symbol' do
131
+ expect(topic.dwell_label).to be_a(Symbol)
132
+ end
133
+ end
134
+
135
+ describe '#engagement_label' do
136
+ it 'returns a symbol' do
137
+ expect(topic.engagement_label).to be_a(Symbol)
138
+ end
139
+ end
140
+
141
+ describe '#to_h' do
142
+ it 'includes all fields' do
143
+ hash = topic.to_h
144
+ expect(hash).to include(
145
+ :id, :content, :topic_type, :salience, :novelty,
146
+ :emotional_intensity, :complexity, :dwell_level, :dwell_label,
147
+ :sticky, :fleeting, :ruminating, :disengagement_difficulty,
148
+ :disengage_label, :engagement_count, :engagement_label, :created_at
149
+ )
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/executive/executive_function/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Executive::ExecutiveFunction::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to all runner methods' do
9
+ %i[inhibit shift_task update_wm common_ef_status component_status
10
+ can_perform task_switch_cost executive_load
11
+ update_executive_function executive_function_stats].each do |method|
12
+ expect(client).to respond_to(method)
13
+ end
14
+ end
15
+
16
+ it 'maintains state across calls' do
17
+ client.inhibit(target: :noise)
18
+ stats = client.executive_function_stats
19
+ expect(stats[:inhibition_count]).to eq(1)
20
+ end
21
+
22
+ it 'full round-trip: inhibit -> shift -> update -> stats' do
23
+ client.inhibit(target: :distraction, reason: :prepotent)
24
+ client.shift_task(from: :idle, to: :active)
25
+ client.update_wm(slot: :focus, new_value: :high)
26
+
27
+ stats = client.executive_function_stats
28
+ expect(stats[:success]).to be true
29
+ expect(stats[:inhibition_count]).to eq(1)
30
+ expect(stats[:task_history_size]).to eq(1)
31
+ expect(stats[:update_count]).to eq(1)
32
+ expect(stats[:current_task_set]).to eq(:active)
33
+ end
34
+
35
+ it 'common EF level decreases under load' do
36
+ initial = client.common_ef_status[:common_ef_level]
37
+ 15.times { client.inhibit(target: :x) }
38
+ expect(client.common_ef_status[:common_ef_level]).to be <= initial
39
+ end
40
+ end