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,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/trust/helpers/trust_model'
4
+ require 'legion/extensions/agentic/social/trust/helpers/trust_map'
5
+ require 'legion/extensions/agentic/social/trust/runners/trust'
6
+
7
+ module Legion
8
+ module Extensions
9
+ module Agentic
10
+ module Social
11
+ module Trust
12
+ class Client
13
+ include Runners::Trust
14
+
15
+ def initialize(**)
16
+ @trust_map = Helpers::TrustMap.new
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :trust_map
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Trust
8
+ module Helpers
9
+ class TrustMap
10
+ attr_reader :entries
11
+
12
+ def initialize
13
+ @entries = {} # key: "agent_id:domain"
14
+ load_from_local
15
+ end
16
+
17
+ def get(agent_id, domain: :general)
18
+ @entries[key(agent_id, domain)]
19
+ end
20
+
21
+ def get_or_create(agent_id, domain: :general)
22
+ @entries[key(agent_id, domain)] ||= TrustModel.new_trust_entry(agent_id: agent_id, domain: domain)
23
+ end
24
+
25
+ def record_interaction(agent_id, positive:, domain: :general)
26
+ entry = get_or_create(agent_id, domain: domain)
27
+ entry[:interaction_count] += 1
28
+ entry[:last_interaction] = Time.now.utc
29
+
30
+ if positive
31
+ entry[:positive_count] += 1
32
+ TrustModel::TRUST_DIMENSIONS.each do |dim|
33
+ entry[:dimensions][dim] = TrustModel.clamp(entry[:dimensions][dim] + TrustModel::TRUST_REINFORCEMENT)
34
+ end
35
+ else
36
+ entry[:negative_count] += 1
37
+ TrustModel::TRUST_DIMENSIONS.each do |dim|
38
+ entry[:dimensions][dim] = TrustModel.clamp(entry[:dimensions][dim] - TrustModel::TRUST_PENALTY)
39
+ end
40
+ end
41
+
42
+ entry[:composite] = TrustModel.composite_score(entry[:dimensions])
43
+ entry
44
+ end
45
+
46
+ def reinforce_dimension(agent_id, dimension:, domain: :general, amount: TrustModel::TRUST_REINFORCEMENT)
47
+ entry = get_or_create(agent_id, domain: domain)
48
+ return unless TrustModel::TRUST_DIMENSIONS.include?(dimension)
49
+
50
+ entry[:dimensions][dimension] = TrustModel.clamp(entry[:dimensions][dimension] + amount)
51
+ entry[:composite] = TrustModel.composite_score(entry[:dimensions])
52
+ end
53
+
54
+ def decay_all
55
+ decayed = 0
56
+ @entries.each_value do |entry|
57
+ TrustModel::TRUST_DIMENSIONS.each do |dim|
58
+ old = entry[:dimensions][dim]
59
+ entry[:dimensions][dim] = TrustModel.clamp(old - TrustModel::TRUST_DECAY_RATE)
60
+ end
61
+ entry[:composite] = TrustModel.composite_score(entry[:dimensions])
62
+ decayed += 1
63
+ end
64
+ decayed
65
+ end
66
+
67
+ def trusted_agents(domain: :general, min_trust: TrustModel::TRUST_CONSIDER_THRESHOLD)
68
+ @entries.values
69
+ .select { |e| e[:domain] == domain && e[:composite] >= min_trust }
70
+ .sort_by { |e| -e[:composite] }
71
+ end
72
+
73
+ def delegatable_agents(domain: :general)
74
+ trusted_agents(domain: domain, min_trust: TrustModel::TRUST_DELEGATE_THRESHOLD)
75
+ end
76
+
77
+ def count
78
+ @entries.size
79
+ end
80
+
81
+ def save_to_local
82
+ return unless defined?(Legion::Data::Local) && Legion::Data::Local.connected?
83
+
84
+ dataset = Legion::Data::Local.connection[:trust_entries]
85
+
86
+ @entries.each_value do |entry|
87
+ row = {
88
+ agent_id: entry[:agent_id].to_s,
89
+ domain: entry[:domain].to_s,
90
+ reliability: entry[:dimensions][:reliability],
91
+ competence: entry[:dimensions][:competence],
92
+ integrity: entry[:dimensions][:integrity],
93
+ benevolence: entry[:dimensions][:benevolence],
94
+ composite: entry[:composite],
95
+ interaction_count: entry[:interaction_count],
96
+ positive_count: entry[:positive_count],
97
+ negative_count: entry[:negative_count],
98
+ last_interaction: entry[:last_interaction],
99
+ created_at: entry[:created_at]
100
+ }
101
+ existing = dataset.where(agent_id: row[:agent_id], domain: row[:domain]).first
102
+ if existing
103
+ dataset.where(agent_id: row[:agent_id], domain: row[:domain])
104
+ .update(row.except(:agent_id, :domain))
105
+ else
106
+ dataset.insert(row)
107
+ end
108
+ end
109
+
110
+ # Remove DB rows for entries no longer in memory
111
+ memory_pairs = @entries.values.map { |e| [e[:agent_id].to_s, e[:domain].to_s] }
112
+ dataset.each do |row|
113
+ pair = [row[:agent_id], row[:domain]]
114
+ dataset.where(agent_id: pair[0], domain: pair[1]).delete unless memory_pairs.include?(pair)
115
+ end
116
+ rescue StandardError => e
117
+ Legion::Logging.warn "[trust] save_to_local failed: #{e.message}" if defined?(Legion::Logging)
118
+ end
119
+
120
+ def load_from_local
121
+ return unless defined?(Legion::Data::Local) && Legion::Data::Local.connected?
122
+
123
+ Legion::Data::Local.connection[:trust_entries].each do |row|
124
+ agent_id = row[:agent_id]
125
+ domain_str = row[:domain]
126
+ domain_val = domain_str.to_sym
127
+ entry_key = "#{agent_id}:#{domain_str}"
128
+ @entries[entry_key] = {
129
+ agent_id: agent_id,
130
+ domain: domain_val,
131
+ dimensions: {
132
+ reliability: row[:reliability].to_f,
133
+ competence: row[:competence].to_f,
134
+ integrity: row[:integrity].to_f,
135
+ benevolence: row[:benevolence].to_f
136
+ },
137
+ composite: row[:composite].to_f,
138
+ interaction_count: row[:interaction_count].to_i,
139
+ positive_count: row[:positive_count].to_i,
140
+ negative_count: row[:negative_count].to_i,
141
+ last_interaction: row[:last_interaction],
142
+ created_at: row[:created_at]
143
+ }
144
+ end
145
+ rescue StandardError => e
146
+ Legion::Logging.warn "[trust] load_from_local failed: #{e.message}" if defined?(Legion::Logging)
147
+ end
148
+
149
+ private
150
+
151
+ def key(agent_id, domain)
152
+ "#{agent_id}:#{domain}"
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Trust
8
+ module Helpers
9
+ module TrustModel
10
+ # Trust is emergent, multidimensional, domain-specific (spec design-decisions-v5 #4)
11
+ TRUST_DIMENSIONS = %i[reliability competence integrity benevolence].freeze
12
+
13
+ # Thresholds
14
+ TRUST_CONSIDER_THRESHOLD = 0.3 # minimum trust to consider agent's input
15
+ TRUST_DELEGATE_THRESHOLD = 0.7 # minimum trust to delegate actions
16
+ TRUST_DECAY_RATE = 0.005 # per-cycle decay
17
+ TRUST_REINFORCEMENT = 0.05 # per positive interaction
18
+ TRUST_PENALTY = 0.15 # per negative interaction (asymmetric)
19
+ NEUTRAL_TRUST = 0.3 # starting trust for new agents
20
+
21
+ module_function
22
+
23
+ def new_trust_entry(agent_id:, domain: :general)
24
+ {
25
+ agent_id: agent_id,
26
+ domain: domain,
27
+ dimensions: TRUST_DIMENSIONS.to_h { |d| [d, NEUTRAL_TRUST] },
28
+ composite: NEUTRAL_TRUST,
29
+ interaction_count: 0,
30
+ positive_count: 0,
31
+ negative_count: 0,
32
+ last_interaction: nil,
33
+ created_at: Time.now.utc
34
+ }
35
+ end
36
+
37
+ def composite_score(dimensions)
38
+ return 0.0 if dimensions.empty?
39
+
40
+ dimensions.values.sum / dimensions.size
41
+ end
42
+
43
+ def clamp(value, min = 0.0, max = 1.0)
44
+ value.clamp(min, max)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ change do
5
+ create_table(:trust_entries) do
6
+ primary_key :id
7
+ String :agent_id, null: false
8
+ String :domain, null: false
9
+ Float :reliability, default: 0.3
10
+ Float :competence, default: 0.3
11
+ Float :integrity, default: 0.3
12
+ Float :benevolence, default: 0.3
13
+ Float :composite, default: 0.3
14
+ Integer :interaction_count, default: 0
15
+ Integer :positive_count, default: 0
16
+ Integer :negative_count, default: 0
17
+ DateTime :last_interaction
18
+ DateTime :created_at, null: false
19
+ unique %i[agent_id domain]
20
+ index [:agent_id]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ module Trust
8
+ module Runners
9
+ module Trust
10
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
11
+ Legion::Extensions::Helpers.const_defined?(:Lex)
12
+
13
+ def get_trust(agent_id:, domain: :general, **)
14
+ entry = trust_map.get(agent_id, domain: domain)
15
+ if entry
16
+ Legion::Logging.debug "[trust] get agent=#{agent_id} domain=#{domain} composite=#{entry[:composite].round(2)}"
17
+ { found: true, trust: entry }
18
+ else
19
+ Legion::Logging.debug "[trust] get agent=#{agent_id} domain=#{domain} not found"
20
+ { found: false, agent_id: agent_id, domain: domain }
21
+ end
22
+ end
23
+
24
+ def record_trust_interaction(agent_id:, positive:, domain: :general, **)
25
+ entry = trust_map.record_interaction(agent_id, domain: domain, positive: positive)
26
+ msg = "[trust] interaction: agent=#{agent_id} domain=#{domain} positive=#{positive} " \
27
+ "composite=#{entry[:composite].round(2)} total=#{entry[:interaction_count]}"
28
+ Legion::Logging.info msg
29
+ {
30
+ agent_id: agent_id,
31
+ domain: domain,
32
+ positive: positive,
33
+ composite: entry[:composite],
34
+ interactions: entry[:interaction_count]
35
+ }
36
+ end
37
+
38
+ def reinforce_trust_dimension(agent_id:, dimension:, domain: :general, amount: nil, **)
39
+ amt = amount || Helpers::TrustModel::TRUST_REINFORCEMENT
40
+ trust_map.reinforce_dimension(agent_id, domain: domain, dimension: dimension, amount: amt)
41
+ entry = trust_map.get(agent_id, domain: domain)
42
+ Legion::Logging.debug "[trust] reinforce: agent=#{agent_id} dimension=#{dimension} amount=#{amt} composite=#{entry[:composite].round(2)}"
43
+ { agent_id: agent_id, domain: domain, dimension: dimension, composite: entry[:composite] }
44
+ end
45
+
46
+ def decay_trust(**)
47
+ decayed = trust_map.decay_all
48
+ Legion::Logging.debug "[trust] decay cycle: entries_updated=#{decayed}"
49
+ { decayed: decayed }
50
+ end
51
+
52
+ def trusted_agents(domain: :general, min_trust: nil, **)
53
+ min = min_trust || Helpers::TrustModel::TRUST_CONSIDER_THRESHOLD
54
+ agents = trust_map.trusted_agents(domain: domain, min_trust: min)
55
+ Legion::Logging.debug "[trust] trusted agents: domain=#{domain} min=#{min} count=#{agents.size}"
56
+ { agents: agents, count: agents.size }
57
+ end
58
+
59
+ def delegatable_agents(domain: :general, **)
60
+ agents = trust_map.delegatable_agents(domain: domain)
61
+ Legion::Logging.debug "[trust] delegatable agents: domain=#{domain} count=#{agents.size}"
62
+ { agents: agents, count: agents.size }
63
+ end
64
+
65
+ def trust_status(**)
66
+ { total_entries: trust_map.count }
67
+ end
68
+
69
+ private
70
+
71
+ def trust_map
72
+ @trust_map ||= Helpers::TrustMap.new
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ 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 Trust
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/trust/version'
4
+ require 'legion/extensions/agentic/social/trust/helpers/trust_model'
5
+ require 'legion/extensions/agentic/social/trust/helpers/trust_map'
6
+ require 'legion/extensions/agentic/social/trust/runners/trust'
7
+ require 'legion/extensions/agentic/social/trust/client'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Agentic
12
+ module Social
13
+ module Trust
14
+ end
15
+ end
16
+ end
17
+
18
+ if defined?(Legion::Data::Local)
19
+ Legion::Data::Local.register_migrations(
20
+ name: :trust,
21
+ path: File.join(__dir__, 'trust', 'local_migrations')
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Social
7
+ VERSION = '0.1.0'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'social/version'
4
+ require_relative 'social/mirror'
5
+ require_relative 'social/entrainment'
6
+ require_relative 'social/symbiosis'
7
+ require_relative 'social/apprenticeship'
8
+ require_relative 'social/theory_of_mind'
9
+ require_relative 'social/mentalizing'
10
+ require_relative 'social/social'
11
+ require_relative 'social/social_learning'
12
+ require_relative 'social/perspective_shifting'
13
+ require_relative 'social/trust'
14
+ require_relative 'social/conflict'
15
+ require_relative 'social/conscience'
16
+ require_relative 'social/consent'
17
+ require_relative 'social/moral_reasoning'
18
+ require_relative 'social/governance'
19
+ require_relative 'social/joint_attention'
20
+ require_relative 'social/mirror_system'
21
+
22
+ module Legion
23
+ module Extensions
24
+ module Agentic
25
+ module Social
26
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
27
+
28
+ def remote_invocable?
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/apprenticeship/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship::Client do
6
+ let(:client) { described_class.new }
7
+
8
+ it 'responds to all runner methods' do
9
+ expect(client).to respond_to(:create_apprenticeship)
10
+ expect(client).to respond_to(:conduct_apprenticeship_session)
11
+ expect(client).to respond_to(:recommend_apprenticeship_method)
12
+ expect(client).to respond_to(:graduated_apprenticeships)
13
+ expect(client).to respond_to(:active_apprenticeships)
14
+ expect(client).to respond_to(:mentor_apprenticeships)
15
+ expect(client).to respond_to(:apprentice_apprenticeships)
16
+ expect(client).to respond_to(:domain_apprenticeships)
17
+ expect(client).to respond_to(:update_cognitive_apprenticeship)
18
+ expect(client).to respond_to(:cognitive_apprenticeship_stats)
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::Agentic::Social::Apprenticeship::VERSION).not_to be_nil
6
+ end
7
+
8
+ it 'has a version that is a string' do
9
+ expect(Legion::Extensions::Agentic::Social::Apprenticeship::VERSION).to be_a(String)
10
+ end
11
+ end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipEngine do
4
+ let(:engine) { described_class.new }
5
+
6
+ let(:params) do
7
+ {
8
+ skill_name: 'terraform',
9
+ domain: 'infrastructure',
10
+ mentor_id: 'mentor-1',
11
+ apprentice_id: 'learner-1'
12
+ }
13
+ end
14
+
15
+ def create_one
16
+ engine.create_apprenticeship(**params)
17
+ end
18
+
19
+ describe '#create_apprenticeship' do
20
+ it 'returns a new Apprenticeship' do
21
+ appr = create_one
22
+ expect(appr).to be_a(Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::Apprenticeship)
23
+ end
24
+
25
+ it 'stores the apprenticeship' do
26
+ appr = create_one
27
+ expect(engine.get(appr.id)).to eq(appr)
28
+ end
29
+
30
+ it 'increments count' do
31
+ expect { create_one }.to change(engine, :count).by(1)
32
+ end
33
+
34
+ it 'returns nil at capacity' do
35
+ stub_const('Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel::MAX_APPRENTICESHIPS', 1)
36
+ create_one
37
+ expect(engine.create_apprenticeship(**params)).to be_nil
38
+ end
39
+ end
40
+
41
+ describe '#conduct_session' do
42
+ it 'returns the apprenticeship after learning' do
43
+ appr = create_one
44
+ result = engine.conduct_session(apprenticeship_id: appr.id, method: :modeling, success: true)
45
+ expect(result).to eq(appr)
46
+ end
47
+
48
+ it 'returns nil for unknown id' do
49
+ expect(engine.conduct_session(apprenticeship_id: 'nope', method: :modeling, success: true)).to be_nil
50
+ end
51
+
52
+ it 'records the session' do
53
+ appr = create_one
54
+ engine.conduct_session(apprenticeship_id: appr.id, method: :coaching, success: true)
55
+ expect(engine.sessions.size).to eq(1)
56
+ end
57
+ end
58
+
59
+ describe '#recommend_method' do
60
+ it 'returns the recommended method' do
61
+ appr = create_one
62
+ method = engine.recommend_method(apprenticeship_id: appr.id)
63
+ expect(Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel::METHODS).to include(method)
64
+ end
65
+
66
+ it 'returns nil for unknown id' do
67
+ expect(engine.recommend_method(apprenticeship_id: 'nope')).to be_nil
68
+ end
69
+ end
70
+
71
+ describe '#graduated_apprenticeships' do
72
+ it 'returns apprenticeships that have graduated' do
73
+ appr = create_one
74
+ 30.times { engine.conduct_session(apprenticeship_id: appr.id, method: :exploration, success: true) }
75
+ expect(engine.graduated_apprenticeships).to include(appr)
76
+ end
77
+
78
+ it 'excludes non-graduated apprenticeships' do
79
+ create_one
80
+ expect(engine.graduated_apprenticeships).to be_empty
81
+ end
82
+ end
83
+
84
+ describe '#active_apprenticeships' do
85
+ it 'returns non-graduated apprenticeships' do
86
+ create_one
87
+ expect(engine.active_apprenticeships.size).to eq(1)
88
+ end
89
+
90
+ it 'excludes graduated apprenticeships' do
91
+ appr = create_one
92
+ 30.times { engine.conduct_session(apprenticeship_id: appr.id, method: :exploration, success: true) }
93
+ expect(engine.active_apprenticeships).to be_empty
94
+ end
95
+ end
96
+
97
+ describe '#by_mentor' do
98
+ it 'returns apprenticeships for the given mentor' do
99
+ create_one
100
+ result = engine.by_mentor(mentor_id: 'mentor-1')
101
+ expect(result.size).to eq(1)
102
+ end
103
+
104
+ it 'returns empty for unknown mentor' do
105
+ create_one
106
+ expect(engine.by_mentor(mentor_id: 'nobody')).to be_empty
107
+ end
108
+ end
109
+
110
+ describe '#by_apprentice' do
111
+ it 'returns apprenticeships for the given apprentice' do
112
+ create_one
113
+ result = engine.by_apprentice(apprentice_id: 'learner-1')
114
+ expect(result.size).to eq(1)
115
+ end
116
+ end
117
+
118
+ describe '#by_domain' do
119
+ it 'returns apprenticeships in the given domain' do
120
+ create_one
121
+ result = engine.by_domain(domain: 'infrastructure')
122
+ expect(result.size).to eq(1)
123
+ end
124
+
125
+ it 'returns empty for unknown domain' do
126
+ create_one
127
+ expect(engine.by_domain(domain: 'unknown')).to be_empty
128
+ end
129
+ end
130
+
131
+ describe '#decay_all' do
132
+ it 'applies decay to all apprenticeships and returns count' do
133
+ create_one
134
+ expect(engine.decay_all).to eq(1)
135
+ end
136
+ end
137
+
138
+ describe '#to_h' do
139
+ it 'returns a summary hash' do
140
+ create_one
141
+ h = engine.to_h
142
+ expect(h).to include(:total, :active, :graduated, :sessions)
143
+ expect(h[:total]).to eq(1)
144
+ end
145
+ end
146
+ end