lex-agentic-social 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 (235) 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-social.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/social/apprenticeship/client.rb +28 -0
  8. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship.rb +90 -0
  9. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_engine.rb +109 -0
  10. data/lib/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_model.rb +93 -0
  11. data/lib/legion/extensions/agentic/social/apprenticeship/runners/cognitive_apprenticeship.rb +112 -0
  12. data/lib/legion/extensions/agentic/social/apprenticeship/version.rb +13 -0
  13. data/lib/legion/extensions/agentic/social/apprenticeship.rb +19 -0
  14. data/lib/legion/extensions/agentic/social/conflict/actors/stale_check.rb +45 -0
  15. data/lib/legion/extensions/agentic/social/conflict/client.rb +27 -0
  16. data/lib/legion/extensions/agentic/social/conflict/helpers/conflict_log.rb +70 -0
  17. data/lib/legion/extensions/agentic/social/conflict/helpers/llm_enhancer.rb +130 -0
  18. data/lib/legion/extensions/agentic/social/conflict/helpers/severity.rb +47 -0
  19. data/lib/legion/extensions/agentic/social/conflict/runners/conflict.rb +112 -0
  20. data/lib/legion/extensions/agentic/social/conflict/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/social/conflict.rb +19 -0
  22. data/lib/legion/extensions/agentic/social/conscience/client.rb +26 -0
  23. data/lib/legion/extensions/agentic/social/conscience/helpers/constants.rb +53 -0
  24. data/lib/legion/extensions/agentic/social/conscience/helpers/moral_evaluator.rb +178 -0
  25. data/lib/legion/extensions/agentic/social/conscience/helpers/moral_store.rb +116 -0
  26. data/lib/legion/extensions/agentic/social/conscience/runners/conscience.rb +117 -0
  27. data/lib/legion/extensions/agentic/social/conscience/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/social/conscience.rb +19 -0
  29. data/lib/legion/extensions/agentic/social/consent/actors/tier_evaluation.rb +45 -0
  30. data/lib/legion/extensions/agentic/social/consent/client.rb +27 -0
  31. data/lib/legion/extensions/agentic/social/consent/helpers/consent_map.rb +199 -0
  32. data/lib/legion/extensions/agentic/social/consent/helpers/tiers.rb +54 -0
  33. data/lib/legion/extensions/agentic/social/consent/local_migrations/20260316000010_create_consent_domains.rb +16 -0
  34. data/lib/legion/extensions/agentic/social/consent/runners/consent.rb +228 -0
  35. data/lib/legion/extensions/agentic/social/consent/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/social/consent.rb +25 -0
  37. data/lib/legion/extensions/agentic/social/entrainment/client.rb +19 -0
  38. data/lib/legion/extensions/agentic/social/entrainment/helpers/constants.rb +40 -0
  39. data/lib/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine.rb +120 -0
  40. data/lib/legion/extensions/agentic/social/entrainment/helpers/pairing.rb +86 -0
  41. data/lib/legion/extensions/agentic/social/entrainment/runners/cognitive_entrainment.rb +89 -0
  42. data/lib/legion/extensions/agentic/social/entrainment/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/social/entrainment.rb +19 -0
  44. data/lib/legion/extensions/agentic/social/governance/actors/shadow_ai_scan.rb +19 -0
  45. data/lib/legion/extensions/agentic/social/governance/actors/vote_timeout.rb +45 -0
  46. data/lib/legion/extensions/agentic/social/governance/client.rb +27 -0
  47. data/lib/legion/extensions/agentic/social/governance/helpers/layers.rb +40 -0
  48. data/lib/legion/extensions/agentic/social/governance/helpers/proposal.rb +94 -0
  49. data/lib/legion/extensions/agentic/social/governance/runners/governance.rb +87 -0
  50. data/lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb +93 -0
  51. data/lib/legion/extensions/agentic/social/governance/version.rb +13 -0
  52. data/lib/legion/extensions/agentic/social/governance.rb +20 -0
  53. data/lib/legion/extensions/agentic/social/joint_attention/actors/decay.rb +45 -0
  54. data/lib/legion/extensions/agentic/social/joint_attention/client.rb +28 -0
  55. data/lib/legion/extensions/agentic/social/joint_attention/helpers/attention_target.rb +124 -0
  56. data/lib/legion/extensions/agentic/social/joint_attention/helpers/constants.rb +34 -0
  57. data/lib/legion/extensions/agentic/social/joint_attention/helpers/joint_focus_manager.rb +157 -0
  58. data/lib/legion/extensions/agentic/social/joint_attention/runners/joint_attention.rb +88 -0
  59. data/lib/legion/extensions/agentic/social/joint_attention/version.rb +13 -0
  60. data/lib/legion/extensions/agentic/social/joint_attention.rb +20 -0
  61. data/lib/legion/extensions/agentic/social/mentalizing/actors/decay.rb +45 -0
  62. data/lib/legion/extensions/agentic/social/mentalizing/client.rb +28 -0
  63. data/lib/legion/extensions/agentic/social/mentalizing/helpers/belief_attribution.rb +58 -0
  64. data/lib/legion/extensions/agentic/social/mentalizing/helpers/constants.rb +33 -0
  65. data/lib/legion/extensions/agentic/social/mentalizing/helpers/mental_model.rb +137 -0
  66. data/lib/legion/extensions/agentic/social/mentalizing/runners/mentalizing.rb +93 -0
  67. data/lib/legion/extensions/agentic/social/mentalizing/version.rb +13 -0
  68. data/lib/legion/extensions/agentic/social/mentalizing.rb +20 -0
  69. data/lib/legion/extensions/agentic/social/mirror/client.rb +33 -0
  70. data/lib/legion/extensions/agentic/social/mirror/helpers/constants.rb +65 -0
  71. data/lib/legion/extensions/agentic/social/mirror/helpers/mirror_engine.rb +132 -0
  72. data/lib/legion/extensions/agentic/social/mirror/helpers/mirror_event.rb +46 -0
  73. data/lib/legion/extensions/agentic/social/mirror/helpers/simulation.rb +43 -0
  74. data/lib/legion/extensions/agentic/social/mirror/runners/observe.rb +52 -0
  75. data/lib/legion/extensions/agentic/social/mirror/runners/resonance.rb +79 -0
  76. data/lib/legion/extensions/agentic/social/mirror/runners/simulate.rb +63 -0
  77. data/lib/legion/extensions/agentic/social/mirror/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/social/mirror.rb +22 -0
  79. data/lib/legion/extensions/agentic/social/mirror_system/actors/decay.rb +45 -0
  80. data/lib/legion/extensions/agentic/social/mirror_system/client.rb +28 -0
  81. data/lib/legion/extensions/agentic/social/mirror_system/helpers/constants.rb +62 -0
  82. data/lib/legion/extensions/agentic/social/mirror_system/helpers/mirror_system.rb +162 -0
  83. data/lib/legion/extensions/agentic/social/mirror_system/helpers/observed_behavior.rb +67 -0
  84. data/lib/legion/extensions/agentic/social/mirror_system/runners/mirror.rb +99 -0
  85. data/lib/legion/extensions/agentic/social/mirror_system/version.rb +13 -0
  86. data/lib/legion/extensions/agentic/social/mirror_system.rb +20 -0
  87. data/lib/legion/extensions/agentic/social/moral_reasoning/client.rb +19 -0
  88. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/constants.rb +49 -0
  89. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/dilemma.rb +68 -0
  90. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/llm_enhancer.rb +140 -0
  91. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/moral_engine.rb +239 -0
  92. data/lib/legion/extensions/agentic/social/moral_reasoning/helpers/moral_foundation.rb +45 -0
  93. data/lib/legion/extensions/agentic/social/moral_reasoning/runners/moral_reasoning.rb +121 -0
  94. data/lib/legion/extensions/agentic/social/moral_reasoning/version.rb +13 -0
  95. data/lib/legion/extensions/agentic/social/moral_reasoning.rb +21 -0
  96. data/lib/legion/extensions/agentic/social/perspective_shifting/client.rb +29 -0
  97. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/constants.rb +67 -0
  98. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/perspective.rb +45 -0
  99. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_view.rb +57 -0
  100. data/lib/legion/extensions/agentic/social/perspective_shifting/helpers/shifting_engine.rb +166 -0
  101. data/lib/legion/extensions/agentic/social/perspective_shifting/runners/perspective_shifting.rb +167 -0
  102. data/lib/legion/extensions/agentic/social/perspective_shifting/version.rb +13 -0
  103. data/lib/legion/extensions/agentic/social/perspective_shifting.rb +20 -0
  104. data/lib/legion/extensions/agentic/social/social/client.rb +25 -0
  105. data/lib/legion/extensions/agentic/social/social/helpers/constants.rb +84 -0
  106. data/lib/legion/extensions/agentic/social/social/helpers/social_graph.rb +172 -0
  107. data/lib/legion/extensions/agentic/social/social/runners/social.rb +146 -0
  108. data/lib/legion/extensions/agentic/social/social/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/social/social.rb +18 -0
  110. data/lib/legion/extensions/agentic/social/social_learning/client.rb +25 -0
  111. data/lib/legion/extensions/agentic/social/social_learning/helpers/constants.rb +42 -0
  112. data/lib/legion/extensions/agentic/social/social_learning/helpers/model_agent.rb +82 -0
  113. data/lib/legion/extensions/agentic/social/social_learning/helpers/observed_behavior.rb +61 -0
  114. data/lib/legion/extensions/agentic/social/social_learning/helpers/social_learning_engine.rb +134 -0
  115. data/lib/legion/extensions/agentic/social/social_learning/runners/social_learning.rb +105 -0
  116. data/lib/legion/extensions/agentic/social/social_learning/version.rb +13 -0
  117. data/lib/legion/extensions/agentic/social/social_learning.rb +20 -0
  118. data/lib/legion/extensions/agentic/social/symbiosis/client.rb +23 -0
  119. data/lib/legion/extensions/agentic/social/symbiosis/helpers/constants.rb +50 -0
  120. data/lib/legion/extensions/agentic/social/symbiosis/helpers/ecosystem.rb +113 -0
  121. data/lib/legion/extensions/agentic/social/symbiosis/helpers/symbiosis_engine.rb +104 -0
  122. data/lib/legion/extensions/agentic/social/symbiosis/helpers/symbiotic_bond.rb +112 -0
  123. data/lib/legion/extensions/agentic/social/symbiosis/runners/cognitive_symbiosis.rb +101 -0
  124. data/lib/legion/extensions/agentic/social/symbiosis/version.rb +13 -0
  125. data/lib/legion/extensions/agentic/social/symbiosis.rb +22 -0
  126. data/lib/legion/extensions/agentic/social/theory_of_mind/client.rb +26 -0
  127. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/agent_model.rb +173 -0
  128. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/constants.rb +70 -0
  129. data/lib/legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker.rb +169 -0
  130. data/lib/legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind.rb +159 -0
  131. data/lib/legion/extensions/agentic/social/theory_of_mind/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/social/theory_of_mind.rb +19 -0
  133. data/lib/legion/extensions/agentic/social/trust/actors/decay.rb +45 -0
  134. data/lib/legion/extensions/agentic/social/trust/client.rb +27 -0
  135. data/lib/legion/extensions/agentic/social/trust/helpers/trust_map.rb +160 -0
  136. data/lib/legion/extensions/agentic/social/trust/helpers/trust_model.rb +52 -0
  137. data/lib/legion/extensions/agentic/social/trust/local_migrations/20260316000020_create_trust_entries.rb +23 -0
  138. data/lib/legion/extensions/agentic/social/trust/runners/trust.rb +80 -0
  139. data/lib/legion/extensions/agentic/social/trust/version.rb +13 -0
  140. data/lib/legion/extensions/agentic/social/trust.rb +25 -0
  141. data/lib/legion/extensions/agentic/social/version.rb +11 -0
  142. data/lib/legion/extensions/agentic/social.rb +34 -0
  143. data/spec/legion/extensions/agentic/social/apprenticeship/client_spec.rb +20 -0
  144. data/spec/legion/extensions/agentic/social/apprenticeship/cognitive_apprenticeship_spec.rb +11 -0
  145. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_engine_spec.rb +146 -0
  146. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_model_spec.rb +124 -0
  147. data/spec/legion/extensions/agentic/social/apprenticeship/helpers/apprenticeship_spec.rb +136 -0
  148. data/spec/legion/extensions/agentic/social/apprenticeship/runners/cognitive_apprenticeship_spec.rb +154 -0
  149. data/spec/legion/extensions/agentic/social/conflict/actors/stale_check_spec.rb +45 -0
  150. data/spec/legion/extensions/agentic/social/conflict/client_spec.rb +15 -0
  151. data/spec/legion/extensions/agentic/social/conflict/helpers/conflict_log_spec.rb +232 -0
  152. data/spec/legion/extensions/agentic/social/conflict/helpers/llm_enhancer_spec.rb +189 -0
  153. data/spec/legion/extensions/agentic/social/conflict/helpers/severity_spec.rb +215 -0
  154. data/spec/legion/extensions/agentic/social/conflict/runners/conflict_spec.rb +151 -0
  155. data/spec/legion/extensions/agentic/social/conscience/client_spec.rb +58 -0
  156. data/spec/legion/extensions/agentic/social/conscience/helpers/constants_spec.rb +124 -0
  157. data/spec/legion/extensions/agentic/social/conscience/helpers/moral_evaluator_spec.rb +253 -0
  158. data/spec/legion/extensions/agentic/social/conscience/helpers/moral_store_spec.rb +230 -0
  159. data/spec/legion/extensions/agentic/social/conscience/runners/conscience_spec.rb +239 -0
  160. data/spec/legion/extensions/agentic/social/consent/actors/tier_evaluation_spec.rb +46 -0
  161. data/spec/legion/extensions/agentic/social/consent/client_spec.rb +33 -0
  162. data/spec/legion/extensions/agentic/social/consent/helpers/tiers_spec.rb +49 -0
  163. data/spec/legion/extensions/agentic/social/consent/local_persistence_spec.rb +234 -0
  164. data/spec/legion/extensions/agentic/social/consent/runners/consent_spec.rb +224 -0
  165. data/spec/legion/extensions/agentic/social/entrainment/client_spec.rb +21 -0
  166. data/spec/legion/extensions/agentic/social/entrainment/helpers/entrainment_engine_spec.rb +116 -0
  167. data/spec/legion/extensions/agentic/social/entrainment/helpers/pairing_spec.rb +103 -0
  168. data/spec/legion/extensions/agentic/social/entrainment/runners/cognitive_entrainment_spec.rb +87 -0
  169. data/spec/legion/extensions/agentic/social/governance/actors/vote_timeout_spec.rb +45 -0
  170. data/spec/legion/extensions/agentic/social/governance/client_spec.rb +14 -0
  171. data/spec/legion/extensions/agentic/social/governance/helpers/layers_spec.rb +190 -0
  172. data/spec/legion/extensions/agentic/social/governance/helpers/proposal_spec.rb +188 -0
  173. data/spec/legion/extensions/agentic/social/governance/runners/governance_spec.rb +101 -0
  174. data/spec/legion/extensions/agentic/social/governance/runners/shadow_ai_spec.rb +65 -0
  175. data/spec/legion/extensions/agentic/social/joint_attention/client_spec.rb +36 -0
  176. data/spec/legion/extensions/agentic/social/joint_attention/helpers/attention_target_spec.rb +258 -0
  177. data/spec/legion/extensions/agentic/social/joint_attention/helpers/joint_focus_manager_spec.rb +238 -0
  178. data/spec/legion/extensions/agentic/social/joint_attention/runners/joint_attention_spec.rb +228 -0
  179. data/spec/legion/extensions/agentic/social/mentalizing/client_spec.rb +19 -0
  180. data/spec/legion/extensions/agentic/social/mentalizing/helpers/belief_attribution_spec.rb +108 -0
  181. data/spec/legion/extensions/agentic/social/mentalizing/helpers/mental_model_spec.rb +179 -0
  182. data/spec/legion/extensions/agentic/social/mentalizing/runners/mentalizing_spec.rb +162 -0
  183. data/spec/legion/extensions/agentic/social/mirror/client_spec.rb +92 -0
  184. data/spec/legion/extensions/agentic/social/mirror/helpers/constants_spec.rb +123 -0
  185. data/spec/legion/extensions/agentic/social/mirror/helpers/mirror_engine_spec.rb +217 -0
  186. data/spec/legion/extensions/agentic/social/mirror/helpers/mirror_event_spec.rb +102 -0
  187. data/spec/legion/extensions/agentic/social/mirror/helpers/simulation_spec.rb +100 -0
  188. data/spec/legion/extensions/agentic/social/mirror/runners/observe_spec.rb +77 -0
  189. data/spec/legion/extensions/agentic/social/mirror/runners/resonance_spec.rb +123 -0
  190. data/spec/legion/extensions/agentic/social/mirror/runners/simulate_spec.rb +103 -0
  191. data/spec/legion/extensions/agentic/social/mirror_system/client_spec.rb +40 -0
  192. data/spec/legion/extensions/agentic/social/mirror_system/helpers/mirror_system_spec.rb +144 -0
  193. data/spec/legion/extensions/agentic/social/mirror_system/helpers/observed_behavior_spec.rb +98 -0
  194. data/spec/legion/extensions/agentic/social/mirror_system/runners/mirror_spec.rb +122 -0
  195. data/spec/legion/extensions/agentic/social/moral_reasoning/client_spec.rb +34 -0
  196. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/dilemma_spec.rb +108 -0
  197. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/llm_enhancer_spec.rb +232 -0
  198. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/moral_engine_spec.rb +266 -0
  199. data/spec/legion/extensions/agentic/social/moral_reasoning/helpers/moral_foundation_spec.rb +70 -0
  200. data/spec/legion/extensions/agentic/social/moral_reasoning/runners/moral_reasoning_spec.rb +275 -0
  201. data/spec/legion/extensions/agentic/social/perspective_shifting/client_spec.rb +30 -0
  202. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/constants_spec.rb +99 -0
  203. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_spec.rb +77 -0
  204. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/perspective_view_spec.rb +105 -0
  205. data/spec/legion/extensions/agentic/social/perspective_shifting/helpers/shifting_engine_spec.rb +246 -0
  206. data/spec/legion/extensions/agentic/social/perspective_shifting/runners/perspective_shifting_spec.rb +277 -0
  207. data/spec/legion/extensions/agentic/social/social/client_spec.rb +72 -0
  208. data/spec/legion/extensions/agentic/social/social/helpers/constants_spec.rb +99 -0
  209. data/spec/legion/extensions/agentic/social/social/helpers/social_graph_spec.rb +322 -0
  210. data/spec/legion/extensions/agentic/social/social/runners/social_spec.rb +220 -0
  211. data/spec/legion/extensions/agentic/social/social_learning/client_spec.rb +25 -0
  212. data/spec/legion/extensions/agentic/social/social_learning/helpers/constants_spec.rb +44 -0
  213. data/spec/legion/extensions/agentic/social/social_learning/helpers/model_agent_spec.rb +120 -0
  214. data/spec/legion/extensions/agentic/social/social_learning/helpers/observed_behavior_spec.rb +81 -0
  215. data/spec/legion/extensions/agentic/social/social_learning/helpers/social_learning_engine_spec.rb +196 -0
  216. data/spec/legion/extensions/agentic/social/social_learning/runners/social_learning_spec.rb +150 -0
  217. data/spec/legion/extensions/agentic/social/symbiosis/client_spec.rb +45 -0
  218. data/spec/legion/extensions/agentic/social/symbiosis/helpers/constants_spec.rb +73 -0
  219. data/spec/legion/extensions/agentic/social/symbiosis/helpers/ecosystem_spec.rb +185 -0
  220. data/spec/legion/extensions/agentic/social/symbiosis/helpers/symbiosis_engine_spec.rb +182 -0
  221. data/spec/legion/extensions/agentic/social/symbiosis/helpers/symbiotic_bond_spec.rb +209 -0
  222. data/spec/legion/extensions/agentic/social/symbiosis/runners/cognitive_symbiosis_spec.rb +182 -0
  223. data/spec/legion/extensions/agentic/social/theory_of_mind/client_spec.rb +63 -0
  224. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/agent_model_spec.rb +244 -0
  225. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/constants_spec.rb +71 -0
  226. data/spec/legion/extensions/agentic/social/theory_of_mind/helpers/mental_state_tracker_spec.rb +228 -0
  227. data/spec/legion/extensions/agentic/social/theory_of_mind/runners/theory_of_mind_spec.rb +221 -0
  228. data/spec/legion/extensions/agentic/social/trust/actors/decay_spec.rb +62 -0
  229. data/spec/legion/extensions/agentic/social/trust/client_spec.rb +17 -0
  230. data/spec/legion/extensions/agentic/social/trust/helpers/trust_map_spec.rb +299 -0
  231. data/spec/legion/extensions/agentic/social/trust/helpers/trust_model_spec.rb +179 -0
  232. data/spec/legion/extensions/agentic/social/trust/local_persistence_spec.rb +359 -0
  233. data/spec/legion/extensions/agentic/social/trust/runners/trust_spec.rb +84 -0
  234. data/spec/spec_helper.rb +54 -0
  235. metadata +319 -0
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Social
9
+ module Governance
10
+ module Actor
11
+ class VoteTimeout < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Social::Governance::Runners::Governance
14
+ end
15
+
16
+ def runner_function
17
+ 'timeout_proposals'
18
+ end
19
+
20
+ def time
21
+ 300
22
+ end
23
+
24
+ def run_now?
25
+ false
26
+ end
27
+
28
+ def use_runner?
29
+ false
30
+ end
31
+
32
+ def check_subtask?
33
+ false
34
+ end
35
+
36
+ def generate_task?
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/governance/helpers/layers'
4
+ require 'legion/extensions/agentic/social/governance/helpers/proposal'
5
+ require 'legion/extensions/agentic/social/governance/runners/governance'
6
+
7
+ module Legion
8
+ module Extensions
9
+ module Agentic
10
+ module Social
11
+ module Governance
12
+ class Client
13
+ include Runners::Governance
14
+
15
+ def initialize(**)
16
+ @proposal_store = Helpers::Proposal.new
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :proposal_store
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Governance
8
+ module Helpers
9
+ module Layers
10
+ # Four governance layers (spec: governance-protocol-spec.md)
11
+ GOVERNANCE_LAYERS = %i[agent_validation anomaly_detection human_deliberation transparency].freeze
12
+
13
+ # Council quorum requirements
14
+ MIN_COUNCIL_SIZE = 3
15
+ QUORUM_FRACTION = 0.66
16
+ VOTE_TIMEOUT = 86_400 # 24 hours
17
+ PROPOSAL_CATEGORIES = %i[policy_change resource_allocation access_control emergency protocol_update].freeze
18
+
19
+ module_function
20
+
21
+ def valid_layer?(layer)
22
+ GOVERNANCE_LAYERS.include?(layer)
23
+ end
24
+
25
+ def valid_category?(category)
26
+ PROPOSAL_CATEGORIES.include?(category)
27
+ end
28
+
29
+ def quorum_met?(votes, council_size)
30
+ return false if council_size < MIN_COUNCIL_SIZE
31
+
32
+ votes >= (council_size * QUORUM_FRACTION).ceil
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Social
9
+ module Governance
10
+ module Helpers
11
+ class Proposal
12
+ attr_reader :proposals
13
+
14
+ def initialize
15
+ @proposals = {}
16
+ end
17
+
18
+ def create(category:, description:, proposer:, council_size: Layers::MIN_COUNCIL_SIZE)
19
+ id = SecureRandom.uuid
20
+ @proposals[id] = {
21
+ proposal_id: id,
22
+ category: category,
23
+ description: description,
24
+ proposer: proposer,
25
+ council_size: council_size,
26
+ votes_for: [],
27
+ votes_against: [],
28
+ status: :open,
29
+ created_at: Time.now.utc,
30
+ resolved_at: nil
31
+ }
32
+ id
33
+ end
34
+
35
+ def vote(proposal_id, voter:, approve:)
36
+ prop = @proposals[proposal_id]
37
+ return nil unless prop && prop[:status] == :open
38
+
39
+ # Prevent double-voting
40
+ all_voters = prop[:votes_for] + prop[:votes_against]
41
+ return :already_voted if all_voters.include?(voter)
42
+
43
+ if approve
44
+ prop[:votes_for] << voter
45
+ else
46
+ prop[:votes_against] << voter
47
+ end
48
+
49
+ check_resolution(proposal_id)
50
+ end
51
+
52
+ def get(proposal_id)
53
+ @proposals[proposal_id]
54
+ end
55
+
56
+ def open_proposals
57
+ @proposals.values.select { |p| p[:status] == :open }
58
+ end
59
+
60
+ def resolve_timed_out(proposal_id)
61
+ prop = @proposals[proposal_id]
62
+ return nil unless prop && prop[:status] == :open
63
+
64
+ prop[:status] = :timed_out
65
+ prop[:resolved_at] = Time.now.utc
66
+ prop
67
+ end
68
+
69
+ private
70
+
71
+ def check_resolution(proposal_id)
72
+ prop = @proposals[proposal_id]
73
+ total_votes = prop[:votes_for].size + prop[:votes_against].size
74
+
75
+ if Layers.quorum_met?(prop[:votes_for].size, prop[:council_size])
76
+ prop[:status] = :approved
77
+ prop[:resolved_at] = Time.now.utc
78
+ :approved
79
+ elsif Layers.quorum_met?(prop[:votes_against].size, prop[:council_size]) ||
80
+ total_votes >= prop[:council_size]
81
+ prop[:status] = :rejected
82
+ prop[:resolved_at] = Time.now.utc
83
+ :rejected
84
+ else
85
+ :pending
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Governance
8
+ module Runners
9
+ module Governance
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def create_proposal(category:, description:, proposer:, council_size: nil, **)
14
+ return { error: :invalid_category, valid: Helpers::Layers::PROPOSAL_CATEGORIES } unless Helpers::Layers.valid_category?(category)
15
+
16
+ size = council_size || Helpers::Layers::MIN_COUNCIL_SIZE
17
+ id = proposal_store.create(category: category, description: description,
18
+ proposer: proposer, council_size: size)
19
+ Legion::Logging.info "[governance] proposal created: id=#{id[0..7]} category=#{category} proposer=#{proposer} council=#{size}"
20
+ { proposal_id: id, category: category, status: :open }
21
+ end
22
+
23
+ def vote_on_proposal(proposal_id:, voter:, approve:, **)
24
+ result = proposal_store.vote(proposal_id, voter: voter, approve: approve)
25
+ case result
26
+ when nil
27
+ Legion::Logging.debug "[governance] vote failed: proposal=#{proposal_id[0..7]} not found or closed"
28
+ { error: :not_found_or_closed }
29
+ when :already_voted
30
+ Legion::Logging.debug "[governance] vote failed: proposal=#{proposal_id[0..7]} voter=#{voter} already voted"
31
+ { error: :already_voted }
32
+ else
33
+ Legion::Logging.info "[governance] vote: proposal=#{proposal_id[0..7]} voter=#{voter} approve=#{approve} resolution=#{result}"
34
+ { voted: true, resolution: result }
35
+ end
36
+ end
37
+
38
+ def get_proposal(proposal_id:, **)
39
+ prop = proposal_store.get(proposal_id)
40
+ Legion::Logging.debug "[governance] get: proposal=#{proposal_id[0..7]} found=#{!prop.nil?}"
41
+ prop ? { found: true, proposal: prop } : { found: false }
42
+ end
43
+
44
+ def open_proposals(**)
45
+ props = proposal_store.open_proposals
46
+ Legion::Logging.debug "[governance] open proposals: count=#{props.size}"
47
+ { proposals: props, count: props.size }
48
+ end
49
+
50
+ def timeout_proposals(**)
51
+ open = proposal_store.open_proposals
52
+ timed = open.select { |p| Time.now.utc - p[:created_at] > Helpers::Layers::VOTE_TIMEOUT }
53
+ timed.each { |p| proposal_store.resolve_timed_out(p[:proposal_id]) }
54
+ timed_ids = timed.map { |p| p[:proposal_id] }
55
+ Legion::Logging.debug "[governance] vote timeout sweep: open=#{open.size} timed_out=#{timed.size}"
56
+ { checked: open.size, timed_out: timed.size, timed_out_ids: timed_ids }
57
+ end
58
+
59
+ def validate_action(layer:, action: nil, _context: {}, **) # rubocop:disable Lint/UnusedMethodArgument
60
+ return { error: :invalid_layer } unless Helpers::Layers.valid_layer?(layer)
61
+
62
+ result = case layer
63
+ when :agent_validation
64
+ { allowed: true, layer: layer, reason: :self_validated }
65
+ when :anomaly_detection
66
+ { allowed: true, layer: layer, reason: :no_anomaly }
67
+ when :human_deliberation
68
+ { allowed: false, layer: layer, reason: :requires_human_approval }
69
+ when :transparency
70
+ { allowed: true, layer: layer, reason: :logged, audit_required: true }
71
+ end
72
+ Legion::Logging.debug "[governance] validate: layer=#{layer} allowed=#{result[:allowed]} reason=#{result[:reason]}"
73
+ result
74
+ end
75
+
76
+ private
77
+
78
+ def proposal_store
79
+ @proposal_store ||= Helpers::Proposal.new
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Governance
8
+ module Runners
9
+ module ShadowAi
10
+ def scan_unregistered_extensions(**)
11
+ installed = Bundler.load.specs.select { |s| s.name.start_with?('lex-') }.map(&:name)
12
+ registered = registered_extension_names
13
+
14
+ unregistered = installed - registered
15
+ { installed: installed.size, registered: registered.size, unregistered: unregistered }
16
+ rescue StandardError => e
17
+ { installed: 0, registered: 0, unregistered: [], error: e.message }
18
+ end
19
+
20
+ def check_llm_bypass_indicators(**)
21
+ indicators = []
22
+ indicators << :direct_openai_key if ENV.key?('OPENAI_API_KEY') && !provider_enabled?(:openai)
23
+ indicators << :direct_anthropic_key if ENV.key?('ANTHROPIC_API_KEY') && !provider_enabled?(:anthropic)
24
+ { indicators: indicators, bypassed: !indicators.empty? }
25
+ end
26
+
27
+ def check_airb_compliance(**)
28
+ return { checked: 0, source: :unavailable } unless defined?(Legion::Data::Model::DigitalWorker)
29
+
30
+ workers = Legion::Data::Model::DigitalWorker.where(lifecycle_state: 'active').all
31
+ non_compliant = workers.select do |w|
32
+ risk = w.respond_to?(:risk_tier) ? w.risk_tier : nil
33
+ %w[high critical].include?(risk) && w.respond_to?(:airb_status) && w.airb_status != 'approved'
34
+ end
35
+
36
+ { checked: workers.size, compliant: workers.size - non_compliant.size,
37
+ non_compliant: non_compliant.map(&:worker_id) }
38
+ rescue StandardError => e
39
+ { checked: 0, error: e.message }
40
+ end
41
+
42
+ def full_scan(**)
43
+ extensions = scan_unregistered_extensions
44
+ bypass = check_llm_bypass_indicators
45
+ compliance = check_airb_compliance
46
+
47
+ has_issues = extensions[:unregistered]&.any? || bypass[:bypassed] || compliance[:non_compliant]&.any?
48
+ emit_shadow_event(extensions, bypass, compliance) if has_issues
49
+
50
+ { extensions: extensions, bypass: bypass, compliance: compliance, issues_found: has_issues }
51
+ end
52
+
53
+ private
54
+
55
+ def registered_extension_names
56
+ return [] unless defined?(Legion::Data) && Legion::Data.respond_to?(:connection)
57
+
58
+ conn = Legion::Data.connection
59
+ return [] unless conn&.table_exists?(:extension_registry)
60
+
61
+ conn[:extension_registry].select_map(:gem_name)
62
+ rescue StandardError
63
+ []
64
+ end
65
+
66
+ def provider_enabled?(provider)
67
+ llm = Legion::Settings[:llm]
68
+ return false unless llm.is_a?(Hash)
69
+
70
+ providers = llm[:providers]
71
+ return false unless providers.is_a?(Hash)
72
+
73
+ providers.dig(provider, :enabled) == true
74
+ rescue StandardError
75
+ false
76
+ end
77
+
78
+ def emit_shadow_event(extensions, bypass, compliance)
79
+ return unless defined?(Legion::Events)
80
+
81
+ Legion::Events.emit('governance.shadow_ai_detected', {
82
+ unregistered: extensions[:unregistered],
83
+ bypass: bypass[:indicators],
84
+ non_compliant: compliance[:non_compliant]
85
+ })
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Governance
8
+ VERSION = '0.2.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/governance/version'
4
+ require 'legion/extensions/agentic/social/governance/helpers/layers'
5
+ require 'legion/extensions/agentic/social/governance/helpers/proposal'
6
+ require 'legion/extensions/agentic/social/governance/runners/governance'
7
+ require 'legion/extensions/agentic/social/governance/runners/shadow_ai'
8
+ require 'legion/extensions/agentic/social/governance/actors/shadow_ai_scan'
9
+ require 'legion/extensions/agentic/social/governance/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Social
15
+ module Governance
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/every'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Social
9
+ module JointAttention
10
+ module Actor
11
+ class Decay < Legion::Extensions::Actors::Every
12
+ def runner_class
13
+ Legion::Extensions::Agentic::Social::JointAttention::Runners::JointAttention
14
+ end
15
+
16
+ def runner_function
17
+ 'update_joint_attention'
18
+ end
19
+
20
+ def time
21
+ 120
22
+ end
23
+
24
+ def run_now?
25
+ false
26
+ end
27
+
28
+ def use_runner?
29
+ false
30
+ end
31
+
32
+ def check_subtask?
33
+ false
34
+ end
35
+
36
+ def generate_task?
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/joint_attention/helpers/constants'
4
+ require 'legion/extensions/agentic/social/joint_attention/helpers/attention_target'
5
+ require 'legion/extensions/agentic/social/joint_attention/helpers/joint_focus_manager'
6
+ require 'legion/extensions/agentic/social/joint_attention/runners/joint_attention'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Social
12
+ module JointAttention
13
+ class Client
14
+ include Runners::JointAttention
15
+
16
+ def initialize(joint_focus_manager: nil, **)
17
+ @joint_focus_manager = joint_focus_manager || Helpers::JointFocusManager.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :joint_focus_manager
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module JointAttention
8
+ module Helpers
9
+ class AttentionTarget
10
+ include Constants
11
+
12
+ attr_reader :id, :name, :domain, :priority, :creator_agent_id, :created_at, :attendees, :focus_strength
13
+
14
+ def initialize(name:, domain:, priority:, creator_agent_id:)
15
+ @id = SecureRandom.uuid
16
+ @name = name
17
+ @domain = domain
18
+ @priority = priority.clamp(0.0, 1.0)
19
+ @creator_agent_id = creator_agent_id
20
+ @created_at = Time.now.utc
21
+ @attendees = {}
22
+ @focus_strength = DEFAULT_FOCUS
23
+ end
24
+
25
+ def add_attendee(agent_id:, gaze: nil)
26
+ return :at_capacity if @attendees.size >= MAX_ATTENDEES_PER_TARGET
27
+ return :already_attending if @attendees.key?(agent_id)
28
+
29
+ @attendees[agent_id] = {
30
+ focus: DEFAULT_FOCUS,
31
+ gaze: gaze,
32
+ joined_at: Time.now.utc,
33
+ mutual_awareness: false
34
+ }
35
+ :joined
36
+ end
37
+
38
+ def remove_attendee(agent_id:)
39
+ return :not_found unless @attendees.key?(agent_id)
40
+
41
+ @attendees.delete(agent_id)
42
+ :removed
43
+ end
44
+
45
+ def update_gaze(agent_id:, gaze:)
46
+ return :not_found unless @attendees.key?(agent_id)
47
+
48
+ @attendees[agent_id][:gaze] = gaze
49
+ :updated
50
+ end
51
+
52
+ def boost_focus(agent_id:, amount:)
53
+ return :not_found unless @attendees.key?(agent_id)
54
+
55
+ current = @attendees[agent_id][:focus]
56
+ @attendees[agent_id][:focus] = [current + amount, 1.0].min
57
+ :boosted
58
+ end
59
+
60
+ def establish_mutual_awareness(agent_a:, agent_b:)
61
+ return :not_found unless @attendees.key?(agent_a) && @attendees.key?(agent_b)
62
+
63
+ bonus = SHARED_AWARENESS_BONUS
64
+ @attendees[agent_a][:mutual_awareness] = true
65
+ @attendees[agent_b][:mutual_awareness] = true
66
+ @attendees[agent_a][:focus] = [@attendees[agent_a][:focus] + bonus, 1.0].min
67
+ @attendees[agent_b][:focus] = [@attendees[agent_b][:focus] + bonus, 1.0].min
68
+ :established
69
+ end
70
+
71
+ def attendee_count
72
+ @attendees.size
73
+ end
74
+
75
+ def shared_awareness?
76
+ @attendees.count { |_, v| v[:mutual_awareness] } >= 2
77
+ end
78
+
79
+ def focus_label
80
+ FOCUS_LABELS.each { |range, lbl| return lbl if range.cover?(@focus_strength) }
81
+ :fading
82
+ end
83
+
84
+ def decay
85
+ @attendees.each_value do |info|
86
+ info[:focus] = [info[:focus] - FOCUS_DECAY, FOCUS_FLOOR].max
87
+ end
88
+ @focus_strength = if @attendees.empty?
89
+ [@focus_strength - FOCUS_DECAY, FOCUS_FLOOR].max
90
+ else
91
+ @attendees.values.sum { |v| v[:focus] } / @attendees.size
92
+ end
93
+ end
94
+
95
+ def faded?
96
+ @focus_strength <= FOCUS_FLOOR && @attendees.empty?
97
+ end
98
+
99
+ def prune_faded_attendees
100
+ @attendees.reject! { |_, v| v[:focus] <= FOCUS_FLOOR }
101
+ end
102
+
103
+ def to_h
104
+ {
105
+ id: @id,
106
+ name: @name,
107
+ domain: @domain,
108
+ priority: @priority,
109
+ creator_agent_id: @creator_agent_id,
110
+ created_at: @created_at,
111
+ focus_strength: @focus_strength.round(4),
112
+ focus_label: focus_label,
113
+ attendee_count: attendee_count,
114
+ shared_awareness: shared_awareness?,
115
+ attendees: @attendees.transform_values { |v| v.merge(focus: v[:focus].round(4)) }
116
+ }
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module JointAttention
8
+ module Helpers
9
+ module Constants
10
+ MAX_TARGETS = 100
11
+ MAX_ATTENDEES_PER_TARGET = 20
12
+ MAX_HISTORY = 200
13
+ FOCUS_DECAY = 0.015
14
+ FOCUS_FLOOR = 0.05
15
+ FOCUS_ALPHA = 0.12
16
+ DEFAULT_FOCUS = 0.5
17
+ SHARED_AWARENESS_BONUS = 0.15
18
+ REFERRAL_BOOST = 0.2
19
+ MAX_SIMULTANEOUS_TARGETS = 5
20
+
21
+ FOCUS_LABELS = {
22
+ (0.8..) => :locked_on,
23
+ (0.6...0.8) => :focused,
24
+ (0.4...0.6) => :attending,
25
+ (0.2...0.4) => :peripheral,
26
+ (..0.2) => :fading
27
+ }.freeze
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end