lex-agentic-imagination 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 (246) 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-imagination.gemspec +34 -0
  7. data/lib/legion/extensions/agentic/imagination/alchemy/client.rb +15 -0
  8. data/lib/legion/extensions/agentic/imagination/alchemy/helpers/alchemy_engine.rb +140 -0
  9. data/lib/legion/extensions/agentic/imagination/alchemy/helpers/constants.rb +76 -0
  10. data/lib/legion/extensions/agentic/imagination/alchemy/helpers/crucible.rb +80 -0
  11. data/lib/legion/extensions/agentic/imagination/alchemy/helpers/substance.rb +118 -0
  12. data/lib/legion/extensions/agentic/imagination/alchemy/runners/cognitive_alchemy.rb +88 -0
  13. data/lib/legion/extensions/agentic/imagination/alchemy/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/imagination/alchemy.rb +22 -0
  15. data/lib/legion/extensions/agentic/imagination/aurora/client.rb +25 -0
  16. data/lib/legion/extensions/agentic/imagination/aurora/helpers/aurora_engine.rb +123 -0
  17. data/lib/legion/extensions/agentic/imagination/aurora/helpers/aurora_event.rb +85 -0
  18. data/lib/legion/extensions/agentic/imagination/aurora/helpers/constants.rb +91 -0
  19. data/lib/legion/extensions/agentic/imagination/aurora/helpers/spectral_band.rb +79 -0
  20. data/lib/legion/extensions/agentic/imagination/aurora/runners/cognitive_aurora.rb +84 -0
  21. data/lib/legion/extensions/agentic/imagination/aurora/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/imagination/aurora.rb +22 -0
  23. data/lib/legion/extensions/agentic/imagination/constellation/client.rb +15 -0
  24. data/lib/legion/extensions/agentic/imagination/constellation/helpers/constants.rb +59 -0
  25. data/lib/legion/extensions/agentic/imagination/constellation/helpers/constellation.rb +90 -0
  26. data/lib/legion/extensions/agentic/imagination/constellation/helpers/sky_engine.rb +131 -0
  27. data/lib/legion/extensions/agentic/imagination/constellation/helpers/star.rb +92 -0
  28. data/lib/legion/extensions/agentic/imagination/constellation/runners/cognitive_constellation.rb +76 -0
  29. data/lib/legion/extensions/agentic/imagination/constellation/version.rb +13 -0
  30. data/lib/legion/extensions/agentic/imagination/constellation.rb +22 -0
  31. data/lib/legion/extensions/agentic/imagination/creativity/client.rb +27 -0
  32. data/lib/legion/extensions/agentic/imagination/creativity/helpers/constants.rb +50 -0
  33. data/lib/legion/extensions/agentic/imagination/creativity/helpers/creative_engine.rb +151 -0
  34. data/lib/legion/extensions/agentic/imagination/creativity/helpers/idea.rb +106 -0
  35. data/lib/legion/extensions/agentic/imagination/creativity/helpers/idea_store.rb +103 -0
  36. data/lib/legion/extensions/agentic/imagination/creativity/runners/creativity.rb +176 -0
  37. data/lib/legion/extensions/agentic/imagination/creativity/version.rb +13 -0
  38. data/lib/legion/extensions/agentic/imagination/creativity.rb +20 -0
  39. data/lib/legion/extensions/agentic/imagination/dream/actors/dream_cycle.rb +45 -0
  40. data/lib/legion/extensions/agentic/imagination/dream/client.rb +29 -0
  41. data/lib/legion/extensions/agentic/imagination/dream/helpers/agenda.rb +74 -0
  42. data/lib/legion/extensions/agentic/imagination/dream/helpers/association_walker.rb +59 -0
  43. data/lib/legion/extensions/agentic/imagination/dream/helpers/constants.rb +34 -0
  44. data/lib/legion/extensions/agentic/imagination/dream/helpers/contradiction_detector.rb +86 -0
  45. data/lib/legion/extensions/agentic/imagination/dream/helpers/dream_journal.rb +231 -0
  46. data/lib/legion/extensions/agentic/imagination/dream/helpers/dream_store.rb +91 -0
  47. data/lib/legion/extensions/agentic/imagination/dream/helpers/llm_enhancer.rb +273 -0
  48. data/lib/legion/extensions/agentic/imagination/dream/runners/dream_cycle.rb +328 -0
  49. data/lib/legion/extensions/agentic/imagination/dream/version.rb +13 -0
  50. data/lib/legion/extensions/agentic/imagination/dream.rb +23 -0
  51. data/lib/legion/extensions/agentic/imagination/embodied_simulation/client.rb +19 -0
  52. data/lib/legion/extensions/agentic/imagination/embodied_simulation/helpers/constants.rb +49 -0
  53. data/lib/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation.rb +136 -0
  54. data/lib/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation_engine.rb +180 -0
  55. data/lib/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation_step.rb +49 -0
  56. data/lib/legion/extensions/agentic/imagination/embodied_simulation/runners/embodied_simulation.rb +99 -0
  57. data/lib/legion/extensions/agentic/imagination/embodied_simulation/version.rb +13 -0
  58. data/lib/legion/extensions/agentic/imagination/embodied_simulation.rb +21 -0
  59. data/lib/legion/extensions/agentic/imagination/garden/client.rb +15 -0
  60. data/lib/legion/extensions/agentic/imagination/garden/helpers/constants.rb +49 -0
  61. data/lib/legion/extensions/agentic/imagination/garden/helpers/garden_engine.rb +138 -0
  62. data/lib/legion/extensions/agentic/imagination/garden/helpers/plant.rb +116 -0
  63. data/lib/legion/extensions/agentic/imagination/garden/helpers/plot.rb +95 -0
  64. data/lib/legion/extensions/agentic/imagination/garden/runners/cognitive_garden.rb +75 -0
  65. data/lib/legion/extensions/agentic/imagination/garden/version.rb +13 -0
  66. data/lib/legion/extensions/agentic/imagination/garden.rb +22 -0
  67. data/lib/legion/extensions/agentic/imagination/genesis/client.rb +27 -0
  68. data/lib/legion/extensions/agentic/imagination/genesis/helpers/concept.rb +86 -0
  69. data/lib/legion/extensions/agentic/imagination/genesis/helpers/constants.rb +132 -0
  70. data/lib/legion/extensions/agentic/imagination/genesis/helpers/genesis_engine.rb +251 -0
  71. data/lib/legion/extensions/agentic/imagination/genesis/helpers/seed.rb +70 -0
  72. data/lib/legion/extensions/agentic/imagination/genesis/runners/genesis.rb +105 -0
  73. data/lib/legion/extensions/agentic/imagination/genesis/version.rb +13 -0
  74. data/lib/legion/extensions/agentic/imagination/genesis.rb +20 -0
  75. data/lib/legion/extensions/agentic/imagination/greenhouse/client.rb +24 -0
  76. data/lib/legion/extensions/agentic/imagination/greenhouse/helpers/constants.rb +89 -0
  77. data/lib/legion/extensions/agentic/imagination/greenhouse/helpers/greenhouse.rb +116 -0
  78. data/lib/legion/extensions/agentic/imagination/greenhouse/helpers/greenhouse_engine.rb +121 -0
  79. data/lib/legion/extensions/agentic/imagination/greenhouse/helpers/seedling.rb +155 -0
  80. data/lib/legion/extensions/agentic/imagination/greenhouse/runners/cognitive_greenhouse.rb +87 -0
  81. data/lib/legion/extensions/agentic/imagination/greenhouse/version.rb +13 -0
  82. data/lib/legion/extensions/agentic/imagination/greenhouse.rb +21 -0
  83. data/lib/legion/extensions/agentic/imagination/imagery/client.rb +21 -0
  84. data/lib/legion/extensions/agentic/imagination/imagery/helpers/constants.rb +55 -0
  85. data/lib/legion/extensions/agentic/imagination/imagery/helpers/scenario.rb +123 -0
  86. data/lib/legion/extensions/agentic/imagination/imagery/helpers/simulation_store.rb +80 -0
  87. data/lib/legion/extensions/agentic/imagination/imagery/runners/imagination.rb +210 -0
  88. data/lib/legion/extensions/agentic/imagination/imagery/version.rb +13 -0
  89. data/lib/legion/extensions/agentic/imagination/imagery.rb +20 -0
  90. data/lib/legion/extensions/agentic/imagination/liminal/client.rb +19 -0
  91. data/lib/legion/extensions/agentic/imagination/liminal/helpers/constants.rb +79 -0
  92. data/lib/legion/extensions/agentic/imagination/liminal/helpers/liminal_engine.rb +115 -0
  93. data/lib/legion/extensions/agentic/imagination/liminal/helpers/threshold_crossing.rb +136 -0
  94. data/lib/legion/extensions/agentic/imagination/liminal/runners/cognitive_liminal.rb +72 -0
  95. data/lib/legion/extensions/agentic/imagination/liminal/version.rb +13 -0
  96. data/lib/legion/extensions/agentic/imagination/liminal.rb +19 -0
  97. data/lib/legion/extensions/agentic/imagination/lucidity/client.rb +25 -0
  98. data/lib/legion/extensions/agentic/imagination/lucidity/helpers/constants.rb +48 -0
  99. data/lib/legion/extensions/agentic/imagination/lucidity/helpers/dream_state.rb +135 -0
  100. data/lib/legion/extensions/agentic/imagination/lucidity/helpers/journal_entry.rb +68 -0
  101. data/lib/legion/extensions/agentic/imagination/lucidity/helpers/lucidity_engine.rb +181 -0
  102. data/lib/legion/extensions/agentic/imagination/lucidity/runners/cognitive_lucidity.rb +95 -0
  103. data/lib/legion/extensions/agentic/imagination/lucidity/version.rb +13 -0
  104. data/lib/legion/extensions/agentic/imagination/lucidity.rb +22 -0
  105. data/lib/legion/extensions/agentic/imagination/mental_simulation/helpers/client.rb +23 -0
  106. data/lib/legion/extensions/agentic/imagination/mental_simulation/helpers/constants.rb +43 -0
  107. data/lib/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation.rb +116 -0
  108. data/lib/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation_engine.rb +141 -0
  109. data/lib/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation_step.rb +53 -0
  110. data/lib/legion/extensions/agentic/imagination/mental_simulation/runners/mental_simulation.rb +92 -0
  111. data/lib/legion/extensions/agentic/imagination/mental_simulation/version.rb +13 -0
  112. data/lib/legion/extensions/agentic/imagination/mental_simulation.rb +20 -0
  113. data/lib/legion/extensions/agentic/imagination/origami/client.rb +41 -0
  114. data/lib/legion/extensions/agentic/imagination/origami/helpers/constants.rb +29 -0
  115. data/lib/legion/extensions/agentic/imagination/origami/helpers/crease.rb +53 -0
  116. data/lib/legion/extensions/agentic/imagination/origami/helpers/figure.rb +106 -0
  117. data/lib/legion/extensions/agentic/imagination/origami/helpers/origami_engine.rb +116 -0
  118. data/lib/legion/extensions/agentic/imagination/origami/runners/cognitive_origami.rb +71 -0
  119. data/lib/legion/extensions/agentic/imagination/origami/version.rb +13 -0
  120. data/lib/legion/extensions/agentic/imagination/origami.rb +22 -0
  121. data/lib/legion/extensions/agentic/imagination/prospection/actors/decay.rb +45 -0
  122. data/lib/legion/extensions/agentic/imagination/prospection/client.rb +26 -0
  123. data/lib/legion/extensions/agentic/imagination/prospection/helpers/constants.rb +41 -0
  124. data/lib/legion/extensions/agentic/imagination/prospection/helpers/prospection_engine.rb +129 -0
  125. data/lib/legion/extensions/agentic/imagination/prospection/helpers/scenario.rb +120 -0
  126. data/lib/legion/extensions/agentic/imagination/prospection/runners/prospection.rb +127 -0
  127. data/lib/legion/extensions/agentic/imagination/prospection/version.rb +13 -0
  128. data/lib/legion/extensions/agentic/imagination/prospection.rb +20 -0
  129. data/lib/legion/extensions/agentic/imagination/time_travel/client.rb +27 -0
  130. data/lib/legion/extensions/agentic/imagination/time_travel/helpers/constants.rb +37 -0
  131. data/lib/legion/extensions/agentic/imagination/time_travel/helpers/mental_journey.rb +149 -0
  132. data/lib/legion/extensions/agentic/imagination/time_travel/helpers/temporal_waypoint.rb +68 -0
  133. data/lib/legion/extensions/agentic/imagination/time_travel/helpers/time_traveler.rb +205 -0
  134. data/lib/legion/extensions/agentic/imagination/time_travel/runners/mental_time_travel.rb +145 -0
  135. data/lib/legion/extensions/agentic/imagination/time_travel/version.rb +13 -0
  136. data/lib/legion/extensions/agentic/imagination/time_travel.rb +20 -0
  137. data/lib/legion/extensions/agentic/imagination/version.rb +11 -0
  138. data/lib/legion/extensions/agentic/imagination/volcano/client.rb +47 -0
  139. data/lib/legion/extensions/agentic/imagination/volcano/helpers/chamber.rb +123 -0
  140. data/lib/legion/extensions/agentic/imagination/volcano/helpers/constants.rb +45 -0
  141. data/lib/legion/extensions/agentic/imagination/volcano/helpers/magma.rb +72 -0
  142. data/lib/legion/extensions/agentic/imagination/volcano/helpers/volcano_engine.rb +120 -0
  143. data/lib/legion/extensions/agentic/imagination/volcano/runners/cognitive_volcano.rb +108 -0
  144. data/lib/legion/extensions/agentic/imagination/volcano/version.rb +13 -0
  145. data/lib/legion/extensions/agentic/imagination/volcano.rb +21 -0
  146. data/lib/legion/extensions/agentic/imagination.rb +34 -0
  147. data/spec/legion/extensions/agentic/imagination/alchemy/client_spec.rb +16 -0
  148. data/spec/legion/extensions/agentic/imagination/alchemy/helpers/alchemy_engine_spec.rb +145 -0
  149. data/spec/legion/extensions/agentic/imagination/alchemy/helpers/constants_spec.rb +45 -0
  150. data/spec/legion/extensions/agentic/imagination/alchemy/helpers/crucible_spec.rb +111 -0
  151. data/spec/legion/extensions/agentic/imagination/alchemy/helpers/substance_spec.rb +174 -0
  152. data/spec/legion/extensions/agentic/imagination/alchemy/runners/cognitive_alchemy_spec.rb +99 -0
  153. data/spec/legion/extensions/agentic/imagination/aurora/client_spec.rb +164 -0
  154. data/spec/legion/extensions/agentic/imagination/aurora/helpers/aurora_engine_spec.rb +291 -0
  155. data/spec/legion/extensions/agentic/imagination/aurora/helpers/aurora_event_spec.rb +217 -0
  156. data/spec/legion/extensions/agentic/imagination/aurora/helpers/spectral_band_spec.rb +186 -0
  157. data/spec/legion/extensions/agentic/imagination/constellation/client_spec.rb +16 -0
  158. data/spec/legion/extensions/agentic/imagination/constellation/helpers/constants_spec.rb +35 -0
  159. data/spec/legion/extensions/agentic/imagination/constellation/helpers/constellation_spec.rb +116 -0
  160. data/spec/legion/extensions/agentic/imagination/constellation/helpers/sky_engine_spec.rb +136 -0
  161. data/spec/legion/extensions/agentic/imagination/constellation/helpers/star_spec.rb +126 -0
  162. data/spec/legion/extensions/agentic/imagination/constellation/runners/cognitive_constellation_spec.rb +86 -0
  163. data/spec/legion/extensions/agentic/imagination/creativity/client_spec.rb +68 -0
  164. data/spec/legion/extensions/agentic/imagination/creativity/helpers/constants_spec.rb +129 -0
  165. data/spec/legion/extensions/agentic/imagination/creativity/helpers/creative_engine_spec.rb +220 -0
  166. data/spec/legion/extensions/agentic/imagination/creativity/helpers/idea_store_spec.rb +232 -0
  167. data/spec/legion/extensions/agentic/imagination/creativity/runners/creativity_spec.rb +237 -0
  168. data/spec/legion/extensions/agentic/imagination/dream/actors/dream_cycle_spec.rb +51 -0
  169. data/spec/legion/extensions/agentic/imagination/dream/client_spec.rb +27 -0
  170. data/spec/legion/extensions/agentic/imagination/dream/helpers/agenda_spec.rb +148 -0
  171. data/spec/legion/extensions/agentic/imagination/dream/helpers/association_walker_spec.rb +123 -0
  172. data/spec/legion/extensions/agentic/imagination/dream/helpers/contradiction_detector_spec.rb +183 -0
  173. data/spec/legion/extensions/agentic/imagination/dream/helpers/dream_store_spec.rb +141 -0
  174. data/spec/legion/extensions/agentic/imagination/dream/integration_spec.rb +98 -0
  175. data/spec/legion/extensions/agentic/imagination/dream/runners/dream_cycle_spec.rb +116 -0
  176. data/spec/legion/extensions/agentic/imagination/embodied_simulation/client_spec.rb +44 -0
  177. data/spec/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation_engine_spec.rb +201 -0
  178. data/spec/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation_spec.rb +178 -0
  179. data/spec/legion/extensions/agentic/imagination/embodied_simulation/helpers/simulation_step_spec.rb +83 -0
  180. data/spec/legion/extensions/agentic/imagination/embodied_simulation/runners/embodied_simulation_spec.rb +124 -0
  181. data/spec/legion/extensions/agentic/imagination/garden/client_spec.rb +34 -0
  182. data/spec/legion/extensions/agentic/imagination/garden/helpers/constants_spec.rb +41 -0
  183. data/spec/legion/extensions/agentic/imagination/garden/helpers/garden_engine_spec.rb +119 -0
  184. data/spec/legion/extensions/agentic/imagination/garden/helpers/plant_spec.rb +147 -0
  185. data/spec/legion/extensions/agentic/imagination/garden/helpers/plot_spec.rb +92 -0
  186. data/spec/legion/extensions/agentic/imagination/garden/runners/cognitive_garden_spec.rb +75 -0
  187. data/spec/legion/extensions/agentic/imagination/genesis/client_spec.rb +110 -0
  188. data/spec/legion/extensions/agentic/imagination/genesis/cognitive_genesis_spec.rb +31 -0
  189. data/spec/legion/extensions/agentic/imagination/genesis/helpers/concept_spec.rb +221 -0
  190. data/spec/legion/extensions/agentic/imagination/genesis/helpers/constants_spec.rb +145 -0
  191. data/spec/legion/extensions/agentic/imagination/genesis/helpers/genesis_engine_spec.rb +339 -0
  192. data/spec/legion/extensions/agentic/imagination/genesis/helpers/seed_spec.rb +197 -0
  193. data/spec/legion/extensions/agentic/imagination/genesis/runners/genesis_spec.rb +177 -0
  194. data/spec/legion/extensions/agentic/imagination/greenhouse/client_spec.rb +89 -0
  195. data/spec/legion/extensions/agentic/imagination/greenhouse/helpers/constants_spec.rb +74 -0
  196. data/spec/legion/extensions/agentic/imagination/greenhouse/helpers/greenhouse_engine_spec.rb +163 -0
  197. data/spec/legion/extensions/agentic/imagination/greenhouse/helpers/greenhouse_spec.rb +193 -0
  198. data/spec/legion/extensions/agentic/imagination/greenhouse/helpers/seedling_spec.rb +224 -0
  199. data/spec/legion/extensions/agentic/imagination/greenhouse/runners/cognitive_greenhouse_spec.rb +139 -0
  200. data/spec/legion/extensions/agentic/imagination/imagery/client_spec.rb +20 -0
  201. data/spec/legion/extensions/agentic/imagination/imagery/helpers/constants_spec.rb +25 -0
  202. data/spec/legion/extensions/agentic/imagination/imagery/helpers/scenario_spec.rb +111 -0
  203. data/spec/legion/extensions/agentic/imagination/imagery/helpers/simulation_store_spec.rb +89 -0
  204. data/spec/legion/extensions/agentic/imagination/imagery/runners/imagination_spec.rb +99 -0
  205. data/spec/legion/extensions/agentic/imagination/liminal/client_spec.rb +21 -0
  206. data/spec/legion/extensions/agentic/imagination/liminal/cognitive_liminal_spec.rb +7 -0
  207. data/spec/legion/extensions/agentic/imagination/liminal/helpers/liminal_engine_spec.rb +130 -0
  208. data/spec/legion/extensions/agentic/imagination/liminal/helpers/threshold_crossing_spec.rb +155 -0
  209. data/spec/legion/extensions/agentic/imagination/liminal/runners_spec.rb +81 -0
  210. data/spec/legion/extensions/agentic/imagination/lucidity/client_spec.rb +76 -0
  211. data/spec/legion/extensions/agentic/imagination/lucidity/cognitive_lucidity_spec.rb +19 -0
  212. data/spec/legion/extensions/agentic/imagination/lucidity/helpers/constants_spec.rb +89 -0
  213. data/spec/legion/extensions/agentic/imagination/lucidity/helpers/dream_state_spec.rb +210 -0
  214. data/spec/legion/extensions/agentic/imagination/lucidity/helpers/journal_entry_spec.rb +103 -0
  215. data/spec/legion/extensions/agentic/imagination/lucidity/helpers/lucidity_engine_spec.rb +259 -0
  216. data/spec/legion/extensions/agentic/imagination/lucidity/runners/cognitive_lucidity_spec.rb +156 -0
  217. data/spec/legion/extensions/agentic/imagination/mental_simulation/helpers/constants_spec.rb +107 -0
  218. data/spec/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation_engine_spec.rb +217 -0
  219. data/spec/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation_spec.rb +223 -0
  220. data/spec/legion/extensions/agentic/imagination/mental_simulation/helpers/simulation_step_spec.rb +111 -0
  221. data/spec/legion/extensions/agentic/imagination/mental_simulation/runners/mental_simulation_spec.rb +184 -0
  222. data/spec/legion/extensions/agentic/imagination/origami/client_spec.rb +98 -0
  223. data/spec/legion/extensions/agentic/imagination/origami/helpers/constants_spec.rb +70 -0
  224. data/spec/legion/extensions/agentic/imagination/origami/helpers/crease_spec.rb +121 -0
  225. data/spec/legion/extensions/agentic/imagination/origami/helpers/figure_spec.rb +212 -0
  226. data/spec/legion/extensions/agentic/imagination/origami/helpers/origami_engine_spec.rb +239 -0
  227. data/spec/legion/extensions/agentic/imagination/origami/runners/cognitive_origami_spec.rb +112 -0
  228. data/spec/legion/extensions/agentic/imagination/prospection/client_spec.rb +107 -0
  229. data/spec/legion/extensions/agentic/imagination/prospection/helpers/prospection_engine_spec.rb +197 -0
  230. data/spec/legion/extensions/agentic/imagination/prospection/helpers/scenario_spec.rb +260 -0
  231. data/spec/legion/extensions/agentic/imagination/prospection/runners/prospection_spec.rb +156 -0
  232. data/spec/legion/extensions/agentic/imagination/time_travel/client_spec.rb +34 -0
  233. data/spec/legion/extensions/agentic/imagination/time_travel/helpers/constants_spec.rb +83 -0
  234. data/spec/legion/extensions/agentic/imagination/time_travel/helpers/mental_journey_spec.rb +274 -0
  235. data/spec/legion/extensions/agentic/imagination/time_travel/helpers/temporal_waypoint_spec.rb +177 -0
  236. data/spec/legion/extensions/agentic/imagination/time_travel/helpers/time_traveler_spec.rb +334 -0
  237. data/spec/legion/extensions/agentic/imagination/time_travel/runners/mental_time_travel_spec.rb +323 -0
  238. data/spec/legion/extensions/agentic/imagination/volcano/client_spec.rb +89 -0
  239. data/spec/legion/extensions/agentic/imagination/volcano/helpers/chamber_spec.rb +266 -0
  240. data/spec/legion/extensions/agentic/imagination/volcano/helpers/constants_spec.rb +83 -0
  241. data/spec/legion/extensions/agentic/imagination/volcano/helpers/magma_spec.rb +157 -0
  242. data/spec/legion/extensions/agentic/imagination/volcano/helpers/volcano_engine_spec.rb +191 -0
  243. data/spec/legion/extensions/agentic/imagination/volcano/integration_spec.rb +148 -0
  244. data/spec/legion/extensions/agentic/imagination/volcano/runners/cognitive_volcano_spec.rb +167 -0
  245. data/spec/spec_helper.rb +54 -0
  246. metadata +386 -0
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Imagery::Runners::Imagination do
4
+ let(:client) { Legion::Extensions::Agentic::Imagination::Imagery::Client.new }
5
+
6
+ describe '#simulate' do
7
+ it 'simulates multiple actions' do
8
+ result = client.simulate(actions: %w[deploy rollback wait])
9
+ expect(result[:scenarios].size).to eq(3)
10
+ expect(result).to have_key(:recommendation)
11
+ end
12
+
13
+ it 'limits to MAX_SCENARIOS' do
14
+ actions = (1..10).map { |i| "action_#{i}" }
15
+ result = client.simulate(actions: actions)
16
+ expect(result[:scenarios].size).to be <= Legion::Extensions::Agentic::Imagination::Imagery::Helpers::Constants::MAX_SCENARIOS
17
+ end
18
+
19
+ it 'stores simulation in history' do
20
+ client.simulate(actions: %w[deploy])
21
+ expect(client.simulation_store.size).to eq(1)
22
+ end
23
+
24
+ it 'recommends the best action' do
25
+ result = client.simulate(
26
+ actions: %w[safe_action risky_action],
27
+ context: { familiar: true, alignment: 0.8 },
28
+ risk_tolerance: :conservative
29
+ )
30
+ expect(result[:recommendation]).to have_key(:action)
31
+ expect(result[:recommendation]).to have_key(:composite)
32
+ end
33
+
34
+ it 'respects risk tolerance' do
35
+ conservative = client.simulate(actions: %w[deploy], risk_tolerance: :conservative)
36
+ aggressive = client.simulate(actions: %w[deploy], risk_tolerance: :aggressive)
37
+ expect(conservative[:recommendation]).not_to be_nil
38
+ expect(aggressive[:recommendation]).not_to be_nil
39
+ end
40
+ end
41
+
42
+ describe '#what_if' do
43
+ it 'returns scenario with consequence chain' do
44
+ result = client.what_if(action: 'merge_without_tests', depth: 2)
45
+ expect(result[:consequence_chain].size).to eq(3)
46
+ expect(result[:depth]).to eq(2)
47
+ end
48
+
49
+ it 'limits depth to MAX_DEPTH' do
50
+ result = client.what_if(action: 'test', depth: 100)
51
+ expect(result[:depth]).to eq(Legion::Extensions::Agentic::Imagination::Imagery::Helpers::Constants::MAX_DEPTH)
52
+ end
53
+
54
+ it 'returns overall valence' do
55
+ result = client.what_if(action: 'safe_deploy', context: { familiar: true })
56
+ expect(result[:overall_valence]).to be_a(Symbol)
57
+ end
58
+ end
59
+
60
+ describe '#compare' do
61
+ it 'compares two actions' do
62
+ result = client.compare(action_a: 'refactor', action_b: 'ship_now')
63
+ expect(%i[a b]).to include(result[:winner])
64
+ expect(result).to have_key(:margin)
65
+ expect(result).to have_key(:decisive)
66
+ end
67
+
68
+ it 'returns scenario details for both' do
69
+ result = client.compare(action_a: 'a', action_b: 'b')
70
+ expect(result[:scenario_a]).to have_key(:expected_value)
71
+ expect(result[:scenario_b]).to have_key(:expected_value)
72
+ end
73
+ end
74
+
75
+ describe '#record_actual_outcome' do
76
+ it 'records outcome for existing simulation' do
77
+ sim = client.simulate(actions: %w[deploy])
78
+ result = client.record_actual_outcome(
79
+ simulation_id: sim[:simulation_id],
80
+ actual_outcome: { valence: :positive }
81
+ )
82
+ expect(result[:accurate]).not_to be_nil
83
+ end
84
+
85
+ it 'returns error for missing simulation' do
86
+ result = client.record_actual_outcome(simulation_id: 'nonexistent', actual_outcome: {})
87
+ expect(result[:error]).to eq(:not_found)
88
+ end
89
+ end
90
+
91
+ describe '#imagination_stats' do
92
+ it 'returns stats summary' do
93
+ client.simulate(actions: %w[deploy])
94
+ result = client.imagination_stats
95
+ expect(result[:total_simulations]).to eq(1)
96
+ expect(result).to have_key(:by_mode)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Liminal::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'responds to runner methods' do
7
+ expect(client).to respond_to(:begin_crossing, :advance_crossing, :liminal_status)
8
+ end
9
+
10
+ it 'runs a full liminal lifecycle' do
11
+ result = client.begin_crossing(origin: :analytical, destination: :creative, domain: :cognitive)
12
+ crossing_id = result[:crossing][:id]
13
+
14
+ 5.times { client.advance_crossing(crossing_id: crossing_id) }
15
+ client.dissolve_crossing(crossing_id: crossing_id)
16
+ 10.times { client.crystallize_crossing(crossing_id: crossing_id) }
17
+
18
+ status = client.liminal_status
19
+ expect(status[:total_crossings]).to eq(1)
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Liminal do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Imagination::Liminal::VERSION).to eq('0.1.0')
6
+ end
7
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Liminal::Helpers::LiminalEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#begin_crossing' do
7
+ it 'creates a threshold crossing' do
8
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
9
+ expect(crossing.origin).to eq(:analytical)
10
+ end
11
+ end
12
+
13
+ describe '#advance_crossing' do
14
+ it 'advances known crossing' do
15
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
16
+ engine.advance_crossing(crossing_id: crossing.id)
17
+ expect(crossing.ticks_in_liminal).to eq(1)
18
+ end
19
+
20
+ it 'returns nil for unknown crossing' do
21
+ expect(engine.advance_crossing(crossing_id: 'bad')).to be_nil
22
+ end
23
+ end
24
+
25
+ describe '#dissolve_crossing' do
26
+ it 'dissolves known crossing' do
27
+ crossing = engine.begin_crossing(origin: :focused, destination: :diffuse)
28
+ original = crossing.ambiguity
29
+ engine.dissolve_crossing(crossing_id: crossing.id)
30
+ expect(crossing.ambiguity).to be > original
31
+ end
32
+ end
33
+
34
+ describe '#crystallize_crossing' do
35
+ it 'crystallizes known crossing' do
36
+ crossing = engine.begin_crossing(origin: :intuitive, destination: :deliberate)
37
+ original = crossing.ambiguity
38
+ engine.crystallize_crossing(crossing_id: crossing.id)
39
+ expect(crossing.ambiguity).to be < original
40
+ end
41
+ end
42
+
43
+ describe '#active_crossings' do
44
+ it 'returns active crossings' do
45
+ engine.begin_crossing(origin: :analytical, destination: :creative)
46
+ expect(engine.active_crossings.size).to eq(1)
47
+ end
48
+ end
49
+
50
+ describe '#completed_crossings' do
51
+ it 'returns completed crossings' do
52
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
53
+ 20.times { crossing.advance! }
54
+ expect(engine.completed_crossings.size).to eq(1)
55
+ end
56
+ end
57
+
58
+ describe '#liminal_crossings' do
59
+ it 'returns crossings in margin phase' do
60
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
61
+ 5.times { crossing.advance! }
62
+ expect(engine.liminal_crossings.size).to eq(1)
63
+ end
64
+ end
65
+
66
+ describe '#fertile_crossings' do
67
+ it 'returns fertile crossings' do
68
+ engine.begin_crossing(origin: :analytical, destination: :creative)
69
+ expect(engine.fertile_crossings.size).to eq(1)
70
+ end
71
+ end
72
+
73
+ describe '#crossings_by_domain' do
74
+ it 'filters by domain' do
75
+ engine.begin_crossing(origin: :analytical, destination: :creative, domain: :cognitive)
76
+ engine.begin_crossing(origin: :focused, destination: :diffuse, domain: :emotional)
77
+ expect(engine.crossings_by_domain(domain: :cognitive).size).to eq(1)
78
+ end
79
+ end
80
+
81
+ describe '#average_ambiguity' do
82
+ it 'returns 0.0 with no active crossings' do
83
+ expect(engine.average_ambiguity).to eq(0.0)
84
+ end
85
+
86
+ it 'returns average for active crossings' do
87
+ engine.begin_crossing(origin: :analytical, destination: :creative, ambiguity: 0.4)
88
+ engine.begin_crossing(origin: :focused, destination: :diffuse, ambiguity: 0.6)
89
+ expect(engine.average_ambiguity).to eq(0.5)
90
+ end
91
+ end
92
+
93
+ describe '#average_creative_potential' do
94
+ it 'returns 0.0 with no active crossings' do
95
+ expect(engine.average_creative_potential).to eq(0.0)
96
+ end
97
+ end
98
+
99
+ describe '#liminal_density' do
100
+ it 'returns 0.0 with no crossings' do
101
+ expect(engine.liminal_density).to eq(0.0)
102
+ end
103
+ end
104
+
105
+ describe '#most_liminal' do
106
+ it 'returns sorted by ambiguity descending' do
107
+ engine.begin_crossing(origin: :analytical, destination: :creative, ambiguity: 0.3)
108
+ high = engine.begin_crossing(origin: :focused, destination: :diffuse, ambiguity: 0.8)
109
+ expect(engine.most_liminal(limit: 1).first.id).to eq(high.id)
110
+ end
111
+ end
112
+
113
+ describe '#liminal_report' do
114
+ it 'includes all report fields' do
115
+ report = engine.liminal_report
116
+ expect(report).to include(
117
+ :total_crossings, :active_count, :liminal_count, :completed_count,
118
+ :fertile_count, :peak_count, :average_ambiguity, :average_potential,
119
+ :liminal_density, :most_liminal
120
+ )
121
+ end
122
+ end
123
+
124
+ describe '#to_h' do
125
+ it 'includes summary fields' do
126
+ hash = engine.to_h
127
+ expect(hash).to include(:total_crossings, :active, :liminal, :avg_ambiguity, :avg_potential)
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Liminal::Helpers::ThresholdCrossing do
4
+ subject(:crossing) { described_class.new(origin: :analytical, destination: :creative) }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(crossing.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'stores origin' do
12
+ expect(crossing.origin).to eq(:analytical)
13
+ end
14
+
15
+ it 'stores destination' do
16
+ expect(crossing.destination).to eq(:creative)
17
+ end
18
+
19
+ it 'defaults to separation phase' do
20
+ expect(crossing.phase).to eq(:separation)
21
+ end
22
+
23
+ it 'defaults ambiguity' do
24
+ expect(crossing.ambiguity).to eq(0.5)
25
+ end
26
+
27
+ it 'starts with active status' do
28
+ expect(crossing.status).to eq(:active)
29
+ end
30
+
31
+ it 'starts with 0 ticks' do
32
+ expect(crossing.ticks_in_liminal).to eq(0)
33
+ end
34
+
35
+ it 'validates origin state' do
36
+ bad = described_class.new(origin: :nonexistent, destination: :creative)
37
+ expect(bad.origin).to eq(:analytical)
38
+ end
39
+ end
40
+
41
+ describe '#advance!' do
42
+ it 'increments ticks' do
43
+ crossing.advance!
44
+ expect(crossing.ticks_in_liminal).to eq(1)
45
+ end
46
+
47
+ it 'increases progress' do
48
+ original = crossing.progress
49
+ crossing.advance!
50
+ expect(crossing.progress).to be > original
51
+ end
52
+
53
+ it 'transitions to margin phase' do
54
+ 5.times { crossing.advance! }
55
+ expect(crossing.phase).to eq(:margin)
56
+ end
57
+
58
+ it 'eventually completes' do
59
+ 20.times { crossing.advance! }
60
+ expect(crossing.incorporated?).to be true
61
+ end
62
+
63
+ it 'does not advance completed crossings' do
64
+ 20.times { crossing.advance! }
65
+ ticks = crossing.ticks_in_liminal
66
+ crossing.advance!
67
+ expect(crossing.ticks_in_liminal).to eq(ticks)
68
+ end
69
+ end
70
+
71
+ describe '#dissolve!' do
72
+ it 'increases ambiguity' do
73
+ original = crossing.ambiguity
74
+ crossing.dissolve!
75
+ expect(crossing.ambiguity).to be > original
76
+ end
77
+
78
+ it 'sets quality to dissolving' do
79
+ crossing.dissolve!
80
+ expect(crossing.quality).to eq(:dissolving)
81
+ end
82
+ end
83
+
84
+ describe '#crystallize!' do
85
+ it 'decreases ambiguity' do
86
+ original = crossing.ambiguity
87
+ crossing.crystallize!
88
+ expect(crossing.ambiguity).to be < original
89
+ end
90
+
91
+ it 'increases progress' do
92
+ original = crossing.progress
93
+ crossing.crystallize!
94
+ expect(crossing.progress).to be > original
95
+ end
96
+
97
+ it 'sets quality to crystallizing' do
98
+ crossing.crystallize!
99
+ expect(crossing.quality).to eq(:crystallizing)
100
+ end
101
+ end
102
+
103
+ describe '#complete!' do
104
+ it 'sets status to completed' do
105
+ crossing.complete!
106
+ expect(crossing.status).to eq(:completed)
107
+ end
108
+
109
+ it 'sets progress to 1.0' do
110
+ crossing.complete!
111
+ expect(crossing.progress).to eq(1.0)
112
+ end
113
+
114
+ it 'clears ambiguity' do
115
+ crossing.complete!
116
+ expect(crossing.ambiguity).to eq(0.0)
117
+ end
118
+ end
119
+
120
+ describe '#liminal?' do
121
+ it 'is false in separation' do
122
+ expect(crossing.liminal?).to be false
123
+ end
124
+
125
+ it 'is true in margin phase' do
126
+ 5.times { crossing.advance! }
127
+ expect(crossing.liminal?).to be true
128
+ end
129
+ end
130
+
131
+ describe '#peak_liminality?' do
132
+ it 'is true when ambiguity is high' do
133
+ 5.times { crossing.dissolve! }
134
+ expect(crossing.peak_liminality?).to be true
135
+ end
136
+ end
137
+
138
+ describe '#fertile?' do
139
+ it 'detects creative potential peak' do
140
+ expect(crossing.fertile?).to be true
141
+ end
142
+ end
143
+
144
+ describe '#to_h' do
145
+ it 'includes all fields' do
146
+ hash = crossing.to_h
147
+ expect(hash).to include(
148
+ :id, :origin, :destination, :domain, :phase, :ambiguity,
149
+ :creative_potential, :progress, :quality, :status,
150
+ :ticks_in_liminal, :liminal, :peak_liminality, :fertile,
151
+ :ambiguity_label, :potential_label, :progress_label, :created_at
152
+ )
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Liminal::Runners::CognitiveLiminal do
4
+ let(:engine) { Legion::Extensions::Agentic::Imagination::Liminal::Helpers::LiminalEngine.new }
5
+ let(:runner) do
6
+ obj = Object.new
7
+ obj.extend(described_class)
8
+ obj.instance_variable_set(:@default_engine, engine)
9
+ obj
10
+ end
11
+
12
+ describe '#begin_crossing' do
13
+ it 'returns success with crossing hash' do
14
+ result = runner.begin_crossing(origin: :analytical, destination: :creative, engine: engine)
15
+ expect(result[:success]).to be true
16
+ expect(result[:crossing][:origin]).to eq(:analytical)
17
+ end
18
+ end
19
+
20
+ describe '#advance_crossing' do
21
+ it 'returns success for known crossing' do
22
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
23
+ result = runner.advance_crossing(crossing_id: crossing.id, engine: engine)
24
+ expect(result[:success]).to be true
25
+ end
26
+
27
+ it 'returns failure for unknown crossing' do
28
+ result = runner.advance_crossing(crossing_id: 'bad', engine: engine)
29
+ expect(result[:success]).to be false
30
+ end
31
+ end
32
+
33
+ describe '#dissolve_crossing' do
34
+ it 'returns success for known crossing' do
35
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
36
+ result = runner.dissolve_crossing(crossing_id: crossing.id, engine: engine)
37
+ expect(result[:success]).to be true
38
+ end
39
+ end
40
+
41
+ describe '#crystallize_crossing' do
42
+ it 'returns success for known crossing' do
43
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
44
+ result = runner.crystallize_crossing(crossing_id: crossing.id, engine: engine)
45
+ expect(result[:success]).to be true
46
+ end
47
+ end
48
+
49
+ describe '#active_crossings' do
50
+ it 'returns active list' do
51
+ engine.begin_crossing(origin: :analytical, destination: :creative)
52
+ result = runner.active_crossings(engine: engine)
53
+ expect(result[:count]).to eq(1)
54
+ end
55
+ end
56
+
57
+ describe '#liminal_crossings' do
58
+ it 'returns liminal list' do
59
+ crossing = engine.begin_crossing(origin: :analytical, destination: :creative)
60
+ 5.times { crossing.advance! }
61
+ result = runner.liminal_crossings(engine: engine)
62
+ expect(result[:count]).to eq(1)
63
+ end
64
+ end
65
+
66
+ describe '#fertile_crossings' do
67
+ it 'returns fertile list' do
68
+ engine.begin_crossing(origin: :analytical, destination: :creative)
69
+ result = runner.fertile_crossings(engine: engine)
70
+ expect(result[:count]).to eq(1)
71
+ end
72
+ end
73
+
74
+ describe '#liminal_status' do
75
+ it 'returns comprehensive status' do
76
+ result = runner.liminal_status(engine: engine)
77
+ expect(result[:success]).to be true
78
+ expect(result).to include(:total_crossings, :liminal_density)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Lucidity::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a LucidityEngine by default' do
8
+ expect(client.send(:default_engine)).to be_a(
9
+ Legion::Extensions::Agentic::Imagination::Lucidity::Helpers::LucidityEngine
10
+ )
11
+ end
12
+
13
+ it 'accepts an injected engine' do
14
+ custom = Legion::Extensions::Agentic::Imagination::Lucidity::Helpers::LucidityEngine.new
15
+ c = described_class.new(engine: custom)
16
+ expect(c.send(:default_engine)).to be(custom)
17
+ end
18
+ end
19
+
20
+ describe 'runner inclusion' do
21
+ it 'responds to begin_dream' do
22
+ expect(client).to respond_to(:begin_dream)
23
+ end
24
+
25
+ it 'responds to reality_test' do
26
+ expect(client).to respond_to(:reality_test)
27
+ end
28
+
29
+ it 'responds to steer_dream' do
30
+ expect(client).to respond_to(:steer_dream)
31
+ end
32
+
33
+ it 'responds to end_dream' do
34
+ expect(client).to respond_to(:end_dream)
35
+ end
36
+
37
+ it 'responds to lucidity_status' do
38
+ expect(client).to respond_to(:lucidity_status)
39
+ end
40
+
41
+ it 'responds to journal_entries' do
42
+ expect(client).to respond_to(:journal_entries)
43
+ end
44
+ end
45
+
46
+ describe 'full workflow' do
47
+ it 'begins a dream, runs a reality test, steers it, and ends it' do
48
+ begin_result = client.begin_dream(theme: :underwater, content: 'coral reef')
49
+ dream_id = begin_result[:dream_id]
50
+
51
+ expect(begin_result[:success]).to be true
52
+
53
+ status = client.lucidity_status
54
+ expect(status[:active_dream]).not_to be_nil
55
+
56
+ engine = client.send(:default_engine)
57
+ state = engine.all_dreams.find { |d| d.id == dream_id }
58
+
59
+ # Force enough lucidity to steer
60
+ 10.times do
61
+ allow(state).to receive(:rand).and_return(0.5)
62
+ state.reality_test!(:hand_check)
63
+ end
64
+
65
+ steer_result = client.steer_dream(dream_id: dream_id, direction: :transform_into_forest)
66
+ expect(steer_result[:success]).to be true
67
+
68
+ end_result = client.end_dream(dream_id: dream_id, insights: ['became aware in dream'])
69
+ expect(end_result[:success]).to be true
70
+
71
+ journal = client.journal_entries
72
+ expect(journal[:count]).to eq(1)
73
+ expect(journal[:entries].first[:insights]).to include('became aware in dream')
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Lucidity do
4
+ it 'has a VERSION constant' do
5
+ expect(described_class::VERSION).to match(/\d+\.\d+\.\d+/)
6
+ end
7
+
8
+ it 'loads the helpers namespace' do
9
+ expect(defined?(Legion::Extensions::Agentic::Imagination::Lucidity::Helpers)).to be_truthy
10
+ end
11
+
12
+ it 'loads the runners namespace' do
13
+ expect(defined?(Legion::Extensions::Agentic::Imagination::Lucidity::Runners)).to be_truthy
14
+ end
15
+
16
+ it 'loads the Client class' do
17
+ expect(defined?(Legion::Extensions::Agentic::Imagination::Lucidity::Client)).to be_truthy
18
+ end
19
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Imagination::Lucidity::Helpers::Constants do
4
+ describe 'MAX_JOURNAL_ENTRIES' do
5
+ it 'is 500' do
6
+ expect(described_class::MAX_JOURNAL_ENTRIES).to eq(500)
7
+ end
8
+ end
9
+
10
+ describe 'MAX_DREAMS' do
11
+ it 'is 100' do
12
+ expect(described_class::MAX_DREAMS).to eq(100)
13
+ end
14
+ end
15
+
16
+ describe 'LUCIDITY_LEVELS' do
17
+ it 'contains five levels in order' do
18
+ expect(described_class::LUCIDITY_LEVELS).to eq(%i[non_lucid pre_lucid semi_lucid lucid fully_lucid])
19
+ end
20
+
21
+ it 'is frozen' do
22
+ expect(described_class::LUCIDITY_LEVELS).to be_frozen
23
+ end
24
+ end
25
+
26
+ describe 'REALITY_TEST_TYPES' do
27
+ it 'contains the expected test types' do
28
+ expect(described_class::REALITY_TEST_TYPES).to include(
29
+ :text_stability, :hand_check, :time_check, :memory_check, :logic_check
30
+ )
31
+ end
32
+
33
+ it 'is frozen' do
34
+ expect(described_class::REALITY_TEST_TYPES).to be_frozen
35
+ end
36
+ end
37
+
38
+ describe 'LUCIDITY_DECAY' do
39
+ it 'is 0.05' do
40
+ expect(described_class::LUCIDITY_DECAY).to eq(0.05)
41
+ end
42
+ end
43
+
44
+ describe 'FALSE_AWAKENING_CHANCE' do
45
+ it 'is 0.1' do
46
+ expect(described_class::FALSE_AWAKENING_CHANCE).to eq(0.1)
47
+ end
48
+ end
49
+
50
+ describe 'DREAM_QUALITY_LABELS' do
51
+ it 'maps ranges to quality labels' do
52
+ expect(described_class::DREAM_QUALITY_LABELS.values).to include(:poor, :ordinary, :vivid, :hyper_vivid)
53
+ end
54
+
55
+ it 'is frozen' do
56
+ expect(described_class::DREAM_QUALITY_LABELS).to be_frozen
57
+ end
58
+ end
59
+
60
+ describe '.label_for' do
61
+ it 'returns :poor for value 0.1' do
62
+ expect(described_class.label_for(0.1)).to eq(:poor)
63
+ end
64
+
65
+ it 'returns :fragmented for value 0.3' do
66
+ expect(described_class.label_for(0.3)).to eq(:fragmented)
67
+ end
68
+
69
+ it 'returns :ordinary for value 0.5' do
70
+ expect(described_class.label_for(0.5)).to eq(:ordinary)
71
+ end
72
+
73
+ it 'returns :vivid for value 0.7' do
74
+ expect(described_class.label_for(0.7)).to eq(:vivid)
75
+ end
76
+
77
+ it 'returns :hyper_vivid for value 0.9' do
78
+ expect(described_class.label_for(0.9)).to eq(:hyper_vivid)
79
+ end
80
+
81
+ it 'clamps values above 1.0' do
82
+ expect(described_class.label_for(1.5)).to eq(:hyper_vivid)
83
+ end
84
+
85
+ it 'clamps values below 0.0' do
86
+ expect(described_class.label_for(-0.5)).to eq(:poor)
87
+ end
88
+ end
89
+ end