lex-agentic-inference 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 (328) 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-inference.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/inference/abductive/client.rb +25 -0
  8. data/lib/legion/extensions/agentic/inference/abductive/helpers/abduction_engine.rb +164 -0
  9. data/lib/legion/extensions/agentic/inference/abductive/helpers/constants.rb +39 -0
  10. data/lib/legion/extensions/agentic/inference/abductive/helpers/hypothesis.rb +106 -0
  11. data/lib/legion/extensions/agentic/inference/abductive/helpers/observation.rb +39 -0
  12. data/lib/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning.rb +129 -0
  13. data/lib/legion/extensions/agentic/inference/abductive/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/inference/abductive.rb +20 -0
  15. data/lib/legion/extensions/agentic/inference/affordance/actors/scan.rb +31 -0
  16. data/lib/legion/extensions/agentic/inference/affordance/client.rb +28 -0
  17. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_field.rb +123 -0
  18. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_item.rb +75 -0
  19. data/lib/legion/extensions/agentic/inference/affordance/helpers/constants.rb +42 -0
  20. data/lib/legion/extensions/agentic/inference/affordance/runners/affordance.rb +90 -0
  21. data/lib/legion/extensions/agentic/inference/affordance/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/inference/affordance.rb +19 -0
  23. data/lib/legion/extensions/agentic/inference/analogical/client.rb +28 -0
  24. data/lib/legion/extensions/agentic/inference/analogical/helpers/analogy_engine.rb +209 -0
  25. data/lib/legion/extensions/agentic/inference/analogical/helpers/constants.rb +38 -0
  26. data/lib/legion/extensions/agentic/inference/analogical/helpers/structure_map.rb +113 -0
  27. data/lib/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning.rb +106 -0
  28. data/lib/legion/extensions/agentic/inference/analogical/version.rb +13 -0
  29. data/lib/legion/extensions/agentic/inference/analogical.rb +19 -0
  30. data/lib/legion/extensions/agentic/inference/argument_mapping/client.rb +19 -0
  31. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument.rb +102 -0
  32. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine.rb +131 -0
  33. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/constants.rb +44 -0
  34. data/lib/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping.rb +78 -0
  35. data/lib/legion/extensions/agentic/inference/argument_mapping/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/inference/argument_mapping.rb +19 -0
  37. data/lib/legion/extensions/agentic/inference/bayesian/client.rb +28 -0
  38. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief.rb +96 -0
  39. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief_network.rb +147 -0
  40. data/lib/legion/extensions/agentic/inference/bayesian/helpers/constants.rb +36 -0
  41. data/lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb +125 -0
  42. data/lib/legion/extensions/agentic/inference/bayesian/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/inference/bayesian.rb +19 -0
  44. data/lib/legion/extensions/agentic/inference/belief_revision/client.rb +19 -0
  45. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief.rb +155 -0
  46. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief_network.rb +193 -0
  47. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/constants.rb +54 -0
  48. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/evidence.rb +49 -0
  49. data/lib/legion/extensions/agentic/inference/belief_revision/runners/belief_revision.rb +89 -0
  50. data/lib/legion/extensions/agentic/inference/belief_revision/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/inference/belief_revision.rb +21 -0
  52. data/lib/legion/extensions/agentic/inference/causal_attribution/client.rb +27 -0
  53. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution.rb +92 -0
  54. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine.rb +159 -0
  55. data/lib/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution.rb +111 -0
  56. data/lib/legion/extensions/agentic/inference/causal_attribution/version.rb +13 -0
  57. data/lib/legion/extensions/agentic/inference/causal_attribution.rb +18 -0
  58. data/lib/legion/extensions/agentic/inference/causal_reasoning/client.rb +24 -0
  59. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge.rb +101 -0
  60. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph.rb +184 -0
  61. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/constants.rb +40 -0
  62. data/lib/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning.rb +111 -0
  63. data/lib/legion/extensions/agentic/inference/causal_reasoning/version.rb +13 -0
  64. data/lib/legion/extensions/agentic/inference/causal_reasoning.rb +19 -0
  65. data/lib/legion/extensions/agentic/inference/coherence/client.rb +28 -0
  66. data/lib/legion/extensions/agentic/inference/coherence/helpers/coherence_engine.rb +170 -0
  67. data/lib/legion/extensions/agentic/inference/coherence/helpers/constants.rb +35 -0
  68. data/lib/legion/extensions/agentic/inference/coherence/helpers/proposition.rb +100 -0
  69. data/lib/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence.rb +123 -0
  70. data/lib/legion/extensions/agentic/inference/coherence/version.rb +13 -0
  71. data/lib/legion/extensions/agentic/inference/coherence.rb +19 -0
  72. data/lib/legion/extensions/agentic/inference/counterfactual/client.rb +19 -0
  73. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/constants.rb +40 -0
  74. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine.rb +157 -0
  75. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/scenario.rb +98 -0
  76. data/lib/legion/extensions/agentic/inference/counterfactual/runners/counterfactual.rb +106 -0
  77. data/lib/legion/extensions/agentic/inference/counterfactual/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/inference/counterfactual.rb +19 -0
  79. data/lib/legion/extensions/agentic/inference/debugging/client.rb +30 -0
  80. data/lib/legion/extensions/agentic/inference/debugging/helpers/causal_trace.rb +51 -0
  81. data/lib/legion/extensions/agentic/inference/debugging/helpers/constants.rb +58 -0
  82. data/lib/legion/extensions/agentic/inference/debugging/helpers/correction.rb +56 -0
  83. data/lib/legion/extensions/agentic/inference/debugging/helpers/debugging_engine.rb +156 -0
  84. data/lib/legion/extensions/agentic/inference/debugging/helpers/reasoning_error.rb +97 -0
  85. data/lib/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging.rb +178 -0
  86. data/lib/legion/extensions/agentic/inference/debugging/version.rb +13 -0
  87. data/lib/legion/extensions/agentic/inference/debugging.rb +21 -0
  88. data/lib/legion/extensions/agentic/inference/enactive_cognition/client.rb +27 -0
  89. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine.rb +120 -0
  90. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop.rb +122 -0
  91. data/lib/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition.rb +124 -0
  92. data/lib/legion/extensions/agentic/inference/enactive_cognition/version.rb +13 -0
  93. data/lib/legion/extensions/agentic/inference/enactive_cognition.rb +18 -0
  94. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/client.rb +17 -0
  95. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/constants.rb +47 -0
  96. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/expectation.rb +82 -0
  97. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine.rb +126 -0
  98. data/lib/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation.rb +76 -0
  99. data/lib/legion/extensions/agentic/inference/expectation_violation/version.rb +13 -0
  100. data/lib/legion/extensions/agentic/inference/expectation_violation.rb +19 -0
  101. data/lib/legion/extensions/agentic/inference/free_energy/client.rb +19 -0
  102. data/lib/legion/extensions/agentic/inference/free_energy/helpers/belief.rb +127 -0
  103. data/lib/legion/extensions/agentic/inference/free_energy/helpers/constants.rb +58 -0
  104. data/lib/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine.rb +156 -0
  105. data/lib/legion/extensions/agentic/inference/free_energy/runners/free_energy.rb +97 -0
  106. data/lib/legion/extensions/agentic/inference/free_energy/version.rb +13 -0
  107. data/lib/legion/extensions/agentic/inference/free_energy.rb +19 -0
  108. data/lib/legion/extensions/agentic/inference/gravity/client.rb +29 -0
  109. data/lib/legion/extensions/agentic/inference/gravity/helpers/attractor.rb +77 -0
  110. data/lib/legion/extensions/agentic/inference/gravity/helpers/constants.rb +76 -0
  111. data/lib/legion/extensions/agentic/inference/gravity/helpers/gravity_engine.rb +164 -0
  112. data/lib/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought.rb +64 -0
  113. data/lib/legion/extensions/agentic/inference/gravity/runners/gravity.rb +132 -0
  114. data/lib/legion/extensions/agentic/inference/gravity/version.rb +13 -0
  115. data/lib/legion/extensions/agentic/inference/gravity.rb +20 -0
  116. data/lib/legion/extensions/agentic/inference/horizon/actors/adjust.rb +45 -0
  117. data/lib/legion/extensions/agentic/inference/horizon/client.rb +28 -0
  118. data/lib/legion/extensions/agentic/inference/horizon/helpers/constants.rb +43 -0
  119. data/lib/legion/extensions/agentic/inference/horizon/helpers/horizon_engine.rb +110 -0
  120. data/lib/legion/extensions/agentic/inference/horizon/helpers/projection.rb +59 -0
  121. data/lib/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon.rb +107 -0
  122. data/lib/legion/extensions/agentic/inference/horizon/version.rb +13 -0
  123. data/lib/legion/extensions/agentic/inference/horizon.rb +19 -0
  124. data/lib/legion/extensions/agentic/inference/hypothesis_testing/client.rb +28 -0
  125. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants.rb +37 -0
  126. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis.rb +83 -0
  127. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine.rb +97 -0
  128. data/lib/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing.rb +115 -0
  129. data/lib/legion/extensions/agentic/inference/hypothesis_testing/version.rb +13 -0
  130. data/lib/legion/extensions/agentic/inference/hypothesis_testing.rb +19 -0
  131. data/lib/legion/extensions/agentic/inference/intuition/client.rb +19 -0
  132. data/lib/legion/extensions/agentic/inference/intuition/helpers/constants.rb +60 -0
  133. data/lib/legion/extensions/agentic/inference/intuition/helpers/heuristic.rb +66 -0
  134. data/lib/legion/extensions/agentic/inference/intuition/helpers/intuition_engine.rb +157 -0
  135. data/lib/legion/extensions/agentic/inference/intuition/helpers/pattern.rb +105 -0
  136. data/lib/legion/extensions/agentic/inference/intuition/runners/intuition.rb +87 -0
  137. data/lib/legion/extensions/agentic/inference/intuition/version.rb +13 -0
  138. data/lib/legion/extensions/agentic/inference/intuition.rb +20 -0
  139. data/lib/legion/extensions/agentic/inference/magnet/client.rb +29 -0
  140. data/lib/legion/extensions/agentic/inference/magnet/helpers/constants.rb +57 -0
  141. data/lib/legion/extensions/agentic/inference/magnet/helpers/field.rb +105 -0
  142. data/lib/legion/extensions/agentic/inference/magnet/helpers/magnet_engine.rb +179 -0
  143. data/lib/legion/extensions/agentic/inference/magnet/helpers/pole.rb +80 -0
  144. data/lib/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet.rb +124 -0
  145. data/lib/legion/extensions/agentic/inference/magnet/version.rb +13 -0
  146. data/lib/legion/extensions/agentic/inference/magnet.rb +21 -0
  147. data/lib/legion/extensions/agentic/inference/momentum/helpers/client.rb +17 -0
  148. data/lib/legion/extensions/agentic/inference/momentum/helpers/constants.rb +65 -0
  149. data/lib/legion/extensions/agentic/inference/momentum/helpers/idea.rb +112 -0
  150. data/lib/legion/extensions/agentic/inference/momentum/helpers/momentum_engine.rb +127 -0
  151. data/lib/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum.rb +101 -0
  152. data/lib/legion/extensions/agentic/inference/momentum/version.rb +13 -0
  153. data/lib/legion/extensions/agentic/inference/momentum.rb +19 -0
  154. data/lib/legion/extensions/agentic/inference/perceptual_inference/client.rb +28 -0
  155. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/constants.rb +34 -0
  156. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field.rb +154 -0
  157. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis.rb +100 -0
  158. data/lib/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference.rb +120 -0
  159. data/lib/legion/extensions/agentic/inference/perceptual_inference/version.rb +13 -0
  160. data/lib/legion/extensions/agentic/inference/perceptual_inference.rb +19 -0
  161. data/lib/legion/extensions/agentic/inference/prediction/actors/expire_predictions.rb +45 -0
  162. data/lib/legion/extensions/agentic/inference/prediction/client.rb +27 -0
  163. data/lib/legion/extensions/agentic/inference/prediction/helpers/modes.rb +28 -0
  164. data/lib/legion/extensions/agentic/inference/prediction/helpers/prediction_store.rb +66 -0
  165. data/lib/legion/extensions/agentic/inference/prediction/runners/prediction.rb +146 -0
  166. data/lib/legion/extensions/agentic/inference/prediction/version.rb +13 -0
  167. data/lib/legion/extensions/agentic/inference/prediction.rb +18 -0
  168. data/lib/legion/extensions/agentic/inference/predictive_coding/actors/decay.rb +45 -0
  169. data/lib/legion/extensions/agentic/inference/predictive_coding/client.rb +28 -0
  170. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/constants.rb +46 -0
  171. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model.rb +187 -0
  172. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error.rb +59 -0
  173. data/lib/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding.rb +171 -0
  174. data/lib/legion/extensions/agentic/inference/predictive_coding/version.rb +13 -0
  175. data/lib/legion/extensions/agentic/inference/predictive_coding.rb +20 -0
  176. data/lib/legion/extensions/agentic/inference/predictive_processing/client.rb +28 -0
  177. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/constants.rb +35 -0
  178. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model.rb +142 -0
  179. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor.rb +129 -0
  180. data/lib/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing.rb +104 -0
  181. data/lib/legion/extensions/agentic/inference/predictive_processing/version.rb +13 -0
  182. data/lib/legion/extensions/agentic/inference/predictive_processing.rb +19 -0
  183. data/lib/legion/extensions/agentic/inference/reality_testing/client.rb +28 -0
  184. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/belief.rb +98 -0
  185. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/constants.rb +41 -0
  186. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine.rb +104 -0
  187. data/lib/legion/extensions/agentic/inference/reality_testing/runners/reality_testing.rb +94 -0
  188. data/lib/legion/extensions/agentic/inference/reality_testing/version.rb +13 -0
  189. data/lib/legion/extensions/agentic/inference/reality_testing.rb +19 -0
  190. data/lib/legion/extensions/agentic/inference/schema/client.rb +26 -0
  191. data/lib/legion/extensions/agentic/inference/schema/helpers/causal_relation.rb +70 -0
  192. data/lib/legion/extensions/agentic/inference/schema/helpers/constants.rb +50 -0
  193. data/lib/legion/extensions/agentic/inference/schema/helpers/world_model.rb +173 -0
  194. data/lib/legion/extensions/agentic/inference/schema/runners/schema.rb +101 -0
  195. data/lib/legion/extensions/agentic/inference/schema/version.rb +13 -0
  196. data/lib/legion/extensions/agentic/inference/schema.rb +19 -0
  197. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/client.rb +28 -0
  198. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants.rb +42 -0
  199. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision.rb +66 -0
  200. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine.rb +139 -0
  201. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance.rb +129 -0
  202. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/version.rb +13 -0
  203. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance.rb +19 -0
  204. data/lib/legion/extensions/agentic/inference/version.rb +11 -0
  205. data/lib/legion/extensions/agentic/inference.rb +44 -0
  206. data/spec/legion/extensions/agentic/inference/abductive/client_spec.rb +25 -0
  207. data/spec/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning_spec.rb +349 -0
  208. data/spec/legion/extensions/agentic/inference/affordance/client_spec.rb +26 -0
  209. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_field_spec.rb +131 -0
  210. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_item_spec.rb +107 -0
  211. data/spec/legion/extensions/agentic/inference/affordance/runners/affordance_spec.rb +78 -0
  212. data/spec/legion/extensions/agentic/inference/analogical/client_spec.rb +31 -0
  213. data/spec/legion/extensions/agentic/inference/analogical/helpers/analogy_engine_spec.rb +276 -0
  214. data/spec/legion/extensions/agentic/inference/analogical/helpers/structure_map_spec.rb +255 -0
  215. data/spec/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning_spec.rb +213 -0
  216. data/spec/legion/extensions/agentic/inference/argument_mapping/client_spec.rb +18 -0
  217. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine_spec.rb +218 -0
  218. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_spec.rb +231 -0
  219. data/spec/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping_spec.rb +171 -0
  220. data/spec/legion/extensions/agentic/inference/bayesian/client_spec.rb +20 -0
  221. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_network_spec.rb +178 -0
  222. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_spec.rb +137 -0
  223. data/spec/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief_spec.rb +176 -0
  224. data/spec/legion/extensions/agentic/inference/belief_revision/client_spec.rb +31 -0
  225. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_network_spec.rb +176 -0
  226. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_spec.rb +153 -0
  227. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/evidence_spec.rb +51 -0
  228. data/spec/legion/extensions/agentic/inference/belief_revision/runners/belief_revision_spec.rb +106 -0
  229. data/spec/legion/extensions/agentic/inference/causal_attribution/client_spec.rb +24 -0
  230. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine_spec.rb +181 -0
  231. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_spec.rb +108 -0
  232. data/spec/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution_spec.rb +142 -0
  233. data/spec/legion/extensions/agentic/inference/causal_reasoning/client_spec.rb +35 -0
  234. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge_spec.rb +158 -0
  235. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph_spec.rb +259 -0
  236. data/spec/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning_spec.rb +161 -0
  237. data/spec/legion/extensions/agentic/inference/coherence/client_spec.rb +17 -0
  238. data/spec/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence_spec.rb +267 -0
  239. data/spec/legion/extensions/agentic/inference/counterfactual/client_spec.rb +48 -0
  240. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/constants_spec.rb +55 -0
  241. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine_spec.rb +234 -0
  242. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/scenario_spec.rb +193 -0
  243. data/spec/legion/extensions/agentic/inference/counterfactual/runners/counterfactual_spec.rb +179 -0
  244. data/spec/legion/extensions/agentic/inference/debugging/client_spec.rb +46 -0
  245. data/spec/legion/extensions/agentic/inference/debugging/helpers/causal_trace_spec.rb +84 -0
  246. data/spec/legion/extensions/agentic/inference/debugging/helpers/constants_spec.rb +97 -0
  247. data/spec/legion/extensions/agentic/inference/debugging/helpers/correction_spec.rb +98 -0
  248. data/spec/legion/extensions/agentic/inference/debugging/helpers/debugging_engine_spec.rb +290 -0
  249. data/spec/legion/extensions/agentic/inference/debugging/helpers/reasoning_error_spec.rb +164 -0
  250. data/spec/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging_spec.rb +301 -0
  251. data/spec/legion/extensions/agentic/inference/enactive_cognition/client_spec.rb +19 -0
  252. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine_spec.rb +181 -0
  253. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop_spec.rb +184 -0
  254. data/spec/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition_spec.rb +214 -0
  255. data/spec/legion/extensions/agentic/inference/expectation_violation/expectation_violation_spec.rb +11 -0
  256. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/expectation_spec.rb +102 -0
  257. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine_spec.rb +121 -0
  258. data/spec/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation_spec.rb +59 -0
  259. data/spec/legion/extensions/agentic/inference/free_energy/client_spec.rb +46 -0
  260. data/spec/legion/extensions/agentic/inference/free_energy/helpers/belief_spec.rb +183 -0
  261. data/spec/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine_spec.rb +211 -0
  262. data/spec/legion/extensions/agentic/inference/free_energy/runners/free_energy_spec.rb +118 -0
  263. data/spec/legion/extensions/agentic/inference/gravity/client_spec.rb +24 -0
  264. data/spec/legion/extensions/agentic/inference/gravity/helpers/attractor_spec.rb +143 -0
  265. data/spec/legion/extensions/agentic/inference/gravity/helpers/constants_spec.rb +107 -0
  266. data/spec/legion/extensions/agentic/inference/gravity/helpers/gravity_engine_spec.rb +193 -0
  267. data/spec/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought_spec.rb +103 -0
  268. data/spec/legion/extensions/agentic/inference/gravity/runners/gravity_spec.rb +159 -0
  269. data/spec/legion/extensions/agentic/inference/horizon/client_spec.rb +58 -0
  270. data/spec/legion/extensions/agentic/inference/horizon/helpers/constants_spec.rb +98 -0
  271. data/spec/legion/extensions/agentic/inference/horizon/helpers/horizon_engine_spec.rb +325 -0
  272. data/spec/legion/extensions/agentic/inference/horizon/helpers/projection_spec.rb +155 -0
  273. data/spec/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon_spec.rb +269 -0
  274. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants_spec.rb +38 -0
  275. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine_spec.rb +182 -0
  276. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_spec.rb +172 -0
  277. data/spec/legion/extensions/agentic/inference/hypothesis_testing/hypothesis_testing_spec.rb +16 -0
  278. data/spec/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing_spec.rb +159 -0
  279. data/spec/legion/extensions/agentic/inference/intuition/client_spec.rb +33 -0
  280. data/spec/legion/extensions/agentic/inference/intuition/helpers/heuristic_spec.rb +82 -0
  281. data/spec/legion/extensions/agentic/inference/intuition/helpers/intuition_engine_spec.rb +163 -0
  282. data/spec/legion/extensions/agentic/inference/intuition/helpers/pattern_spec.rb +160 -0
  283. data/spec/legion/extensions/agentic/inference/intuition/runners/intuition_spec.rb +107 -0
  284. data/spec/legion/extensions/agentic/inference/magnet/client_spec.rb +30 -0
  285. data/spec/legion/extensions/agentic/inference/magnet/helpers/constants_spec.rb +120 -0
  286. data/spec/legion/extensions/agentic/inference/magnet/helpers/field_spec.rb +193 -0
  287. data/spec/legion/extensions/agentic/inference/magnet/helpers/magnet_engine_spec.rb +281 -0
  288. data/spec/legion/extensions/agentic/inference/magnet/helpers/pole_spec.rb +211 -0
  289. data/spec/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet_spec.rb +201 -0
  290. data/spec/legion/extensions/agentic/inference/momentum/cognitive_momentum_spec.rb +11 -0
  291. data/spec/legion/extensions/agentic/inference/momentum/helpers/idea_spec.rb +152 -0
  292. data/spec/legion/extensions/agentic/inference/momentum/helpers/momentum_engine_spec.rb +154 -0
  293. data/spec/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum_spec.rb +97 -0
  294. data/spec/legion/extensions/agentic/inference/perceptual_inference/client_spec.rb +39 -0
  295. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/constants_spec.rb +97 -0
  296. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field_spec.rb +270 -0
  297. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis_spec.rb +206 -0
  298. data/spec/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference_spec.rb +305 -0
  299. data/spec/legion/extensions/agentic/inference/prediction/actors/expire_predictions_spec.rb +46 -0
  300. data/spec/legion/extensions/agentic/inference/prediction/client_spec.rb +14 -0
  301. data/spec/legion/extensions/agentic/inference/prediction/helpers/modes_spec.rb +118 -0
  302. data/spec/legion/extensions/agentic/inference/prediction/helpers/prediction_store_spec.rb +262 -0
  303. data/spec/legion/extensions/agentic/inference/prediction/runners/prediction_spec.rb +116 -0
  304. data/spec/legion/extensions/agentic/inference/predictive_coding/client_spec.rb +74 -0
  305. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model_spec.rb +194 -0
  306. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error_spec.rb +109 -0
  307. data/spec/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding_spec.rb +210 -0
  308. data/spec/legion/extensions/agentic/inference/predictive_processing/client_spec.rb +82 -0
  309. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model_spec.rb +220 -0
  310. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor_spec.rb +206 -0
  311. data/spec/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing_spec.rb +213 -0
  312. data/spec/legion/extensions/agentic/inference/reality_testing/client_spec.rb +29 -0
  313. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/belief_spec.rb +197 -0
  314. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/constants_spec.rb +78 -0
  315. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine_spec.rb +191 -0
  316. data/spec/legion/extensions/agentic/inference/reality_testing/runners/reality_testing_spec.rb +154 -0
  317. data/spec/legion/extensions/agentic/inference/schema/client_spec.rb +53 -0
  318. data/spec/legion/extensions/agentic/inference/schema/helpers/causal_relation_spec.rb +108 -0
  319. data/spec/legion/extensions/agentic/inference/schema/helpers/constants_spec.rb +54 -0
  320. data/spec/legion/extensions/agentic/inference/schema/helpers/world_model_spec.rb +179 -0
  321. data/spec/legion/extensions/agentic/inference/schema/runners/schema_spec.rb +146 -0
  322. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/client_spec.rb +18 -0
  323. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants_spec.rb +62 -0
  324. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision_spec.rb +125 -0
  325. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine_spec.rb +184 -0
  326. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance_spec.rb +157 -0
  327. data/spec/spec_helper.rb +46 -0
  328. metadata +412 -0
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module CausalReasoning
8
+ module Runners
9
+ module CausalReasoning
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def add_causal_variable(name:, domain: :general, **)
14
+ if graph.variable_exists?(name)
15
+ Legion::Logging.warn "[causal] add_variable duplicate: name=#{name}"
16
+ return { success: false, reason: :limit_or_duplicate, name: name }
17
+ end
18
+
19
+ variable = graph.add_variable(name: name, domain: domain)
20
+ if variable
21
+ Legion::Logging.debug "[causal] add_variable: name=#{name} domain=#{domain}"
22
+ { success: true, variable: variable }
23
+ else
24
+ Legion::Logging.warn "[causal] add_variable failed (limit): name=#{name}"
25
+ { success: false, reason: :limit_or_duplicate, name: name }
26
+ end
27
+ end
28
+
29
+ def add_causal_edge(cause:, effect:, edge_type:, domain: :general,
30
+ strength: Helpers::Constants::DEFAULT_STRENGTH, **)
31
+ edge = graph.add_edge(cause: cause, effect: effect,
32
+ edge_type: edge_type, domain: domain, strength: strength)
33
+ if edge
34
+ str = edge.strength.round(2)
35
+ Legion::Logging.debug "[causal] add_edge: #{cause}->#{effect} type=#{edge_type} str=#{str}"
36
+ { success: true, edge: edge.to_h }
37
+ else
38
+ Legion::Logging.warn "[causal] add_edge failed: cause=#{cause} effect=#{effect} type=#{edge_type}"
39
+ { success: false, reason: :limit_or_invalid_type, cause: cause, effect: effect }
40
+ end
41
+ end
42
+
43
+ def find_causes(variable:, **)
44
+ edges = graph.causes_of(variable: variable)
45
+ Legion::Logging.debug "[causal] find_causes: variable=#{variable} count=#{edges.size}"
46
+ { success: true, variable: variable, causes: edges.map(&:to_h), count: edges.size }
47
+ end
48
+
49
+ def find_effects(variable:, **)
50
+ edges = graph.effects_of(variable: variable)
51
+ Legion::Logging.debug "[causal] find_effects: variable=#{variable} count=#{edges.size}"
52
+ { success: true, variable: variable, effects: edges.map(&:to_h), count: edges.size }
53
+ end
54
+
55
+ def trace_causal_chain(from:, to:, max_depth: 5, **)
56
+ paths = graph.causal_chain(from: from, to: to, max_depth: max_depth)
57
+ Legion::Logging.debug "[causal] trace_chain: from=#{from} to=#{to} paths=#{paths.size}"
58
+ { success: true, from: from, to: to, paths: paths, path_count: paths.size }
59
+ end
60
+
61
+ def causal_intervention(variable:, value:, **)
62
+ result = graph.intervene(variable: variable, value: value)
63
+ count = result[:downstream_effects].size
64
+ Legion::Logging.info "[causal] intervention: do(#{variable}=#{value}) downstream=#{count}"
65
+ { success: true }.merge(result)
66
+ end
67
+
68
+ def find_confounders(var_a:, var_b:, **)
69
+ common = graph.confounders(var_a: var_a, var_b: var_b)
70
+ Legion::Logging.debug "[causal] confounders: #{var_a} <-> #{var_b} count=#{common.size}"
71
+ { success: true, var_a: var_a, var_b: var_b, confounders: common, count: common.size }
72
+ end
73
+
74
+ def add_causal_evidence(edge_id:, **)
75
+ edge = graph.add_evidence(edge_id: edge_id)
76
+ if edge
77
+ cnt = edge.evidence_count
78
+ str = edge.strength.round(2)
79
+ Legion::Logging.debug "[causal] add_evidence: edge=#{edge_id} count=#{cnt} strength=#{str}"
80
+ { success: true, edge_id: edge_id, evidence_count: edge.evidence_count, strength: edge.strength }
81
+ else
82
+ Legion::Logging.warn "[causal] add_evidence failed: edge=#{edge_id} not found"
83
+ { success: false, reason: :edge_not_found, edge_id: edge_id }
84
+ end
85
+ end
86
+
87
+ def update_causal_reasoning(**)
88
+ decayed = graph.decay_all
89
+ pruned = graph.prune_weak
90
+ Legion::Logging.debug "[causal] update: decayed=#{decayed} pruned=#{pruned}"
91
+ { success: true, decayed: decayed, pruned: pruned }
92
+ end
93
+
94
+ def causal_reasoning_stats(**)
95
+ stats = graph.to_h
96
+ Legion::Logging.debug "[causal] stats: #{stats.inspect}"
97
+ { success: true }.merge(stats)
98
+ end
99
+
100
+ private
101
+
102
+ def graph
103
+ @graph ||= Helpers::CausalGraph.new
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module CausalReasoning
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/inference/causal_reasoning/version'
4
+ require 'legion/extensions/agentic/inference/causal_reasoning/helpers/constants'
5
+ require 'legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge'
6
+ require 'legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph'
7
+ require 'legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning'
8
+ require 'legion/extensions/agentic/inference/causal_reasoning/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Inference
14
+ module CausalReasoning
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/inference/coherence/helpers/constants'
4
+ require 'legion/extensions/agentic/inference/coherence/helpers/proposition'
5
+ require 'legion/extensions/agentic/inference/coherence/helpers/coherence_engine'
6
+ require 'legion/extensions/agentic/inference/coherence/runners/cognitive_coherence'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Inference
12
+ module Coherence
13
+ class Client
14
+ include Runners::CognitiveCoherence
15
+
16
+ def initialize(**)
17
+ @engine = Helpers::CoherenceEngine.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :engine
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Coherence
8
+ module Helpers
9
+ class CoherenceEngine
10
+ include Constants
11
+
12
+ attr_reader :propositions, :history
13
+
14
+ def initialize
15
+ @propositions = {}
16
+ @history = []
17
+ end
18
+
19
+ def add_proposition(content:, domain: :general, acceptance: DEFAULT_ACCEPTANCE)
20
+ return nil if @propositions.size >= MAX_PROPOSITIONS
21
+
22
+ prop = Proposition.new(content: content, domain: domain, acceptance: acceptance)
23
+ @propositions[prop.id] = prop
24
+ record_history(:add_proposition, { id: prop.id, domain: domain })
25
+ prop.id
26
+ end
27
+
28
+ def add_constraint(prop_a_id:, prop_b_id:, constraint_type:, positive: true)
29
+ prop_a = @propositions[prop_a_id]
30
+ prop_b = @propositions[prop_b_id]
31
+ return { success: false, reason: :proposition_not_found } unless prop_a && prop_b
32
+
33
+ unless CONSTRAINT_TYPES.include?(constraint_type)
34
+ return { success: false,
35
+ reason: :invalid_constraint_type }
36
+ end
37
+
38
+ if positive
39
+ prop_a.add_positive_constraint(proposition_id: prop_b_id)
40
+ prop_b.add_positive_constraint(proposition_id: prop_a_id)
41
+ else
42
+ prop_a.add_negative_constraint(proposition_id: prop_b_id)
43
+ prop_b.add_negative_constraint(proposition_id: prop_a_id)
44
+ end
45
+
46
+ record_history(:add_constraint,
47
+ { prop_a: prop_a_id, prop_b: prop_b_id, type: constraint_type, positive: positive })
48
+ { success: true, constraint_type: constraint_type, positive: positive }
49
+ end
50
+
51
+ def compute_coherence(proposition_id:)
52
+ prop = @propositions[proposition_id]
53
+ return 0.0 unless prop
54
+
55
+ positive_sum = prop.positive_constraints.sum do |pid|
56
+ neighbor = @propositions[pid]
57
+ neighbor ? neighbor.acceptance * COHERENCE_WEIGHT : 0.0
58
+ end
59
+
60
+ negative_sum = prop.negative_constraints.sum do |pid|
61
+ neighbor = @propositions[pid]
62
+ neighbor ? neighbor.acceptance * INCOHERENCE_PENALTY : 0.0
63
+ end
64
+
65
+ (prop.acceptance + positive_sum - negative_sum).clamp(0.0, 1.0)
66
+ end
67
+
68
+ def maximize_coherence
69
+ return { success: true, iterations: 0, proposition_count: 0 } if @propositions.empty?
70
+
71
+ @propositions.each_value { |prop| adjust_proposition(prop) }
72
+
73
+ record_history(:maximize_coherence, { overall: overall_coherence })
74
+ {
75
+ success: true,
76
+ iterations: 1,
77
+ proposition_count: @propositions.size,
78
+ overall_coherence: overall_coherence
79
+ }
80
+ end
81
+
82
+ def overall_coherence
83
+ return 0.0 if @propositions.empty?
84
+
85
+ total = @propositions.values.sum { |prop| compute_coherence(proposition_id: prop.id) }
86
+ total / @propositions.size
87
+ end
88
+
89
+ def coherence_label
90
+ val = overall_coherence
91
+ COHERENCE_LABELS.find { |range, _| range.cover?(val) }&.last || :unknown
92
+ end
93
+
94
+ def find_contradictions
95
+ accepted = @propositions.values.select(&:accepted?)
96
+ pairs = []
97
+ accepted.each { |prop| collect_contradiction_pairs(prop, pairs) }
98
+ pairs
99
+ end
100
+
101
+ def partition
102
+ result = { accepted: [], rejected: [], undecided: [] }
103
+ @propositions.each_value { |prop| result[prop.state] << prop.to_h }
104
+ result
105
+ end
106
+
107
+ def by_domain(domain:)
108
+ @propositions.values.select { |prop| prop.domain == domain }.map(&:to_h)
109
+ end
110
+
111
+ def decay_all
112
+ count = 0
113
+ @propositions.each_value do |prop|
114
+ next if prop.acceptance == DEFAULT_ACCEPTANCE
115
+
116
+ delta = (DEFAULT_ACCEPTANCE - prop.acceptance) * DECAY_RATE
117
+ prop.adjust_acceptance(amount: delta) unless delta.abs < 0.0001
118
+ count += 1
119
+ end
120
+ { success: true, decayed_count: count }
121
+ end
122
+
123
+ def to_h
124
+ {
125
+ proposition_count: @propositions.size,
126
+ overall_coherence: overall_coherence,
127
+ coherence_label: coherence_label,
128
+ partition: partition,
129
+ history_size: @history.size
130
+ }
131
+ end
132
+
133
+ private
134
+
135
+ def adjust_proposition(prop)
136
+ positive_pull = prop.positive_constraints.sum do |pid|
137
+ neighbor = @propositions[pid]
138
+ neighbor ? neighbor.acceptance * COHERENCE_WEIGHT : 0.0
139
+ end
140
+
141
+ negative_push = prop.negative_constraints.sum do |pid|
142
+ neighbor = @propositions[pid]
143
+ neighbor ? neighbor.acceptance * INCOHERENCE_PENALTY : 0.0
144
+ end
145
+
146
+ delta = positive_pull - negative_push
147
+ prop.adjust_acceptance(amount: delta) unless delta.abs < 0.001
148
+ end
149
+
150
+ def collect_contradiction_pairs(prop, pairs)
151
+ prop.negative_constraints.each do |neg_id|
152
+ neighbor = @propositions[neg_id]
153
+ next unless neighbor&.accepted?
154
+ next if pairs.any? { |pair| pair[:prop_b] == prop.id && pair[:prop_a] == neg_id }
155
+
156
+ pairs << { prop_a: prop.id, prop_b: neg_id }
157
+ end
158
+ end
159
+
160
+ def record_history(event, data)
161
+ @history << { event: event, data: data, at: Time.now.utc }
162
+ @history.shift while @history.size > MAX_HISTORY
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Coherence
8
+ module Helpers
9
+ module Constants
10
+ MAX_PROPOSITIONS = 200
11
+ MAX_CONSTRAINTS = 500
12
+ MAX_HISTORY = 300
13
+ DEFAULT_ACCEPTANCE = 0.5
14
+ ACCEPTANCE_THRESHOLD = 0.6
15
+ COHERENCE_WEIGHT = 0.1
16
+ INCOHERENCE_PENALTY = 0.15
17
+ DECAY_RATE = 0.01
18
+
19
+ CONSTRAINT_TYPES = %i[explanatory deductive analogical perceptual conceptual deliberative].freeze
20
+ PROPOSITION_STATES = %i[accepted rejected undecided].freeze
21
+
22
+ COHERENCE_LABELS = {
23
+ (0.8..) => :highly_coherent,
24
+ (0.6...0.8) => :coherent,
25
+ (0.4...0.6) => :mixed,
26
+ (0.2...0.4) => :incoherent,
27
+ (..0.2) => :contradictory
28
+ }.freeze
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module Coherence
10
+ module Helpers
11
+ class Proposition
12
+ include Constants
13
+
14
+ attr_reader :id, :content, :domain, :acceptance,
15
+ :positive_constraints, :negative_constraints,
16
+ :evidence_count, :created_at, :updated_at
17
+
18
+ def initialize(content:, domain: :general, acceptance: DEFAULT_ACCEPTANCE)
19
+ @id = SecureRandom.uuid
20
+ @content = content
21
+ @domain = domain
22
+ @acceptance = acceptance.clamp(0.0, 1.0)
23
+ @positive_constraints = []
24
+ @negative_constraints = []
25
+ @evidence_count = 0
26
+ @created_at = Time.now.utc
27
+ @updated_at = Time.now.utc
28
+ end
29
+
30
+ def state
31
+ if @acceptance >= ACCEPTANCE_THRESHOLD
32
+ :accepted
33
+ elsif @acceptance < (1.0 - ACCEPTANCE_THRESHOLD)
34
+ :rejected
35
+ else
36
+ :undecided
37
+ end
38
+ end
39
+
40
+ def accepted?
41
+ state == :accepted
42
+ end
43
+
44
+ def rejected?
45
+ state == :rejected
46
+ end
47
+
48
+ def undecided?
49
+ state == :undecided
50
+ end
51
+
52
+ def add_positive_constraint(proposition_id:)
53
+ return false if @positive_constraints.include?(proposition_id)
54
+
55
+ @positive_constraints << proposition_id
56
+ @updated_at = Time.now.utc
57
+ true
58
+ end
59
+
60
+ def add_negative_constraint(proposition_id:)
61
+ return false if @negative_constraints.include?(proposition_id)
62
+
63
+ @negative_constraints << proposition_id
64
+ @updated_at = Time.now.utc
65
+ true
66
+ end
67
+
68
+ def adjust_acceptance(amount:)
69
+ @acceptance = (@acceptance + amount).clamp(0.0, 1.0)
70
+ @updated_at = Time.now.utc
71
+ @acceptance
72
+ end
73
+
74
+ def add_evidence
75
+ @evidence_count += 1
76
+ @updated_at = Time.now.utc
77
+ @evidence_count
78
+ end
79
+
80
+ def to_h
81
+ {
82
+ id: @id,
83
+ content: @content,
84
+ domain: @domain,
85
+ acceptance: @acceptance,
86
+ state: state,
87
+ positive_constraints: @positive_constraints.dup,
88
+ negative_constraints: @negative_constraints.dup,
89
+ evidence_count: @evidence_count,
90
+ created_at: @created_at,
91
+ updated_at: @updated_at
92
+ }
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Coherence
8
+ module Runners
9
+ module CognitiveCoherence
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def add_coherence_proposition(content:, domain: :general, acceptance: Helpers::Constants::DEFAULT_ACCEPTANCE,
14
+ **)
15
+ return { success: false, reason: :missing_content } if content.nil? || content.empty?
16
+
17
+ prop_id = engine.add_proposition(content: content, domain: domain, acceptance: acceptance)
18
+ if prop_id
19
+ Legion::Logging.debug "[cognitive_coherence] add_proposition domain=#{domain} id=#{prop_id[0..7]}"
20
+ { success: true, proposition_id: prop_id, domain: domain, acceptance: acceptance }
21
+ else
22
+ Legion::Logging.warn '[cognitive_coherence] add_proposition failed: max propositions reached'
23
+ { success: false, reason: :max_propositions_reached }
24
+ end
25
+ end
26
+
27
+ def add_coherence_constraint(prop_a_id:, prop_b_id:, constraint_type:, positive: true, **)
28
+ unless Helpers::Constants::CONSTRAINT_TYPES.include?(constraint_type)
29
+ return { success: false, reason: :invalid_constraint_type,
30
+ valid_types: Helpers::Constants::CONSTRAINT_TYPES }
31
+ end
32
+
33
+ result = engine.add_constraint(
34
+ prop_a_id: prop_a_id,
35
+ prop_b_id: prop_b_id,
36
+ constraint_type: constraint_type,
37
+ positive: positive
38
+ )
39
+
40
+ Legion::Logging.debug "[cognitive_coherence] add_constraint type=#{constraint_type} " \
41
+ "positive=#{positive} success=#{result[:success]}"
42
+ result
43
+ end
44
+
45
+ def compute_proposition_coherence(proposition_id:, **)
46
+ score = engine.compute_coherence(proposition_id: proposition_id)
47
+ prop = engine.propositions[proposition_id]
48
+
49
+ unless prop
50
+ Legion::Logging.debug "[cognitive_coherence] compute_coherence: #{proposition_id[0..7]} not found"
51
+ return { success: false, reason: :not_found }
52
+ end
53
+
54
+ Legion::Logging.debug '[cognitive_coherence] compute_coherence ' \
55
+ "id=#{proposition_id[0..7]} score=#{score.round(3)}"
56
+ { success: true, proposition_id: proposition_id, coherence_score: score, state: prop.state }
57
+ end
58
+
59
+ def maximize_coherence(**)
60
+ result = engine.maximize_coherence
61
+ overall = result[:overall_coherence]&.round(3)
62
+ Legion::Logging.info '[cognitive_coherence] maximize_coherence ' \
63
+ "overall=#{overall} props=#{result[:proposition_count]}"
64
+ result
65
+ end
66
+
67
+ def find_contradictions(**)
68
+ pairs = engine.find_contradictions
69
+ Legion::Logging.debug "[cognitive_coherence] find_contradictions count=#{pairs.size}"
70
+ { success: true, contradictions: pairs, count: pairs.size }
71
+ end
72
+
73
+ def coherence_partition(**)
74
+ result = engine.partition
75
+ totals = result.transform_values(&:size)
76
+ Legion::Logging.debug "[cognitive_coherence] partition accepted=#{totals[:accepted]} " \
77
+ "rejected=#{totals[:rejected]} undecided=#{totals[:undecided]}"
78
+ { success: true, partition: result, counts: totals }
79
+ end
80
+
81
+ def update_cognitive_coherence(**)
82
+ coherence_result = engine.maximize_coherence
83
+ decay_result = engine.decay_all
84
+
85
+ overall = coherence_result[:overall_coherence]&.round(3)
86
+ Legion::Logging.info "[cognitive_coherence] update overall=#{overall} " \
87
+ "decayed=#{decay_result[:decayed_count]}"
88
+ {
89
+ success: true,
90
+ overall_coherence: coherence_result[:overall_coherence],
91
+ coherence_label: engine.coherence_label,
92
+ decayed_count: decay_result[:decayed_count]
93
+ }
94
+ end
95
+
96
+ def cognitive_coherence_stats(**)
97
+ part = engine.partition
98
+ counts = part.transform_values(&:size)
99
+ Legion::Logging.debug "[cognitive_coherence] stats propositions=#{engine.propositions.size} " \
100
+ "coherence=#{engine.overall_coherence.round(3)}"
101
+ {
102
+ success: true,
103
+ proposition_count: engine.propositions.size,
104
+ overall_coherence: engine.overall_coherence,
105
+ coherence_label: engine.coherence_label,
106
+ partition_counts: counts,
107
+ contradiction_count: engine.find_contradictions.size,
108
+ history_size: engine.history.size
109
+ }
110
+ end
111
+
112
+ private
113
+
114
+ def engine
115
+ @engine ||= Helpers::CoherenceEngine.new
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Coherence
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/inference/coherence/version'
4
+ require 'legion/extensions/agentic/inference/coherence/helpers/constants'
5
+ require 'legion/extensions/agentic/inference/coherence/helpers/proposition'
6
+ require 'legion/extensions/agentic/inference/coherence/helpers/coherence_engine'
7
+ require 'legion/extensions/agentic/inference/coherence/runners/cognitive_coherence'
8
+ require 'legion/extensions/agentic/inference/coherence/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Agentic
13
+ module Inference
14
+ module Coherence
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module Counterfactual
8
+ class Client
9
+ include Runners::Counterfactual
10
+
11
+ def initialize(**opts)
12
+ @engine = opts[:engine] if opts[:engine]
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end