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,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel do
4
+ subject(:model) { described_class }
5
+
6
+ describe 'constants' do
7
+ it 'defines METHODS with six items' do
8
+ expect(model::METHODS.size).to eq(6)
9
+ expect(model::METHODS).to include(:modeling, :coaching, :scaffolding, :articulation, :reflection, :exploration)
10
+ end
11
+
12
+ it 'defines MASTERY_THRESHOLD as 0.85' do
13
+ expect(model::MASTERY_THRESHOLD).to eq(0.85)
14
+ end
15
+
16
+ it 'defines LEARNING_GAIN as 0.08' do
17
+ expect(model::LEARNING_GAIN).to eq(0.08)
18
+ end
19
+
20
+ it 'defines EXPLORATION_MULTIPLIER as 2.0' do
21
+ expect(model::EXPLORATION_MULTIPLIER).to eq(2.0)
22
+ end
23
+
24
+ it 'defines COACHING_MULTIPLIER as 1.5' do
25
+ expect(model::COACHING_MULTIPLIER).to eq(1.5)
26
+ end
27
+
28
+ it 'defines DECAY_RATE as 0.01' do
29
+ expect(model::DECAY_RATE).to eq(0.01)
30
+ end
31
+ end
32
+
33
+ describe '.phase_for' do
34
+ it 'returns :modeling for mastery 0.0..0.19' do
35
+ expect(model.phase_for(0.0)).to eq(:modeling)
36
+ expect(model.phase_for(0.1)).to eq(:modeling)
37
+ end
38
+
39
+ it 'returns :coaching for mastery 0.2..0.39' do
40
+ expect(model.phase_for(0.2)).to eq(:coaching)
41
+ expect(model.phase_for(0.3)).to eq(:coaching)
42
+ end
43
+
44
+ it 'returns :scaffolding for mastery 0.4..0.59' do
45
+ expect(model.phase_for(0.4)).to eq(:scaffolding)
46
+ end
47
+
48
+ it 'returns :articulation for mastery 0.6..0.74' do
49
+ expect(model.phase_for(0.6)).to eq(:articulation)
50
+ end
51
+
52
+ it 'returns :reflection for mastery 0.75..0.84' do
53
+ expect(model.phase_for(0.75)).to eq(:reflection)
54
+ end
55
+
56
+ it 'returns :exploration for mastery >= 0.85' do
57
+ expect(model.phase_for(0.85)).to eq(:exploration)
58
+ expect(model.phase_for(1.0)).to eq(:exploration)
59
+ end
60
+ end
61
+
62
+ describe '.mastery_label_for' do
63
+ it 'returns :novice for mastery < 0.2' do
64
+ expect(model.mastery_label_for(0.1)).to eq(:novice)
65
+ end
66
+
67
+ it 'returns :apprentice for mastery 0.2..0.39' do
68
+ expect(model.mastery_label_for(0.3)).to eq(:apprentice)
69
+ end
70
+
71
+ it 'returns :intermediate for mastery 0.4..0.59' do
72
+ expect(model.mastery_label_for(0.5)).to eq(:intermediate)
73
+ end
74
+
75
+ it 'returns :proficient for mastery 0.6..0.79' do
76
+ expect(model.mastery_label_for(0.7)).to eq(:proficient)
77
+ end
78
+
79
+ it 'returns :expert for mastery >= 0.8' do
80
+ expect(model.mastery_label_for(0.9)).to eq(:expert)
81
+ end
82
+ end
83
+
84
+ describe '.clamp_mastery' do
85
+ it 'floors at MASTERY_FLOOR' do
86
+ expect(model.clamp_mastery(-0.5)).to eq(0.0)
87
+ end
88
+
89
+ it 'caps at MASTERY_CEILING' do
90
+ expect(model.clamp_mastery(1.5)).to eq(1.0)
91
+ end
92
+
93
+ it 'passes through valid values' do
94
+ expect(model.clamp_mastery(0.5)).to eq(0.5)
95
+ end
96
+ end
97
+
98
+ describe '.new_apprenticeship' do
99
+ let(:entry) do
100
+ model.new_apprenticeship(
101
+ skill_name: 'ruby',
102
+ domain: 'programming',
103
+ mentor_id: 'mentor-1',
104
+ apprentice_id: 'apprentice-1'
105
+ )
106
+ end
107
+
108
+ it 'sets default mastery' do
109
+ expect(entry[:mastery]).to eq(model::DEFAULT_MASTERY)
110
+ end
111
+
112
+ it 'sets current_phase from mastery' do
113
+ expect(entry[:current_phase]).to eq(model.phase_for(model::DEFAULT_MASTERY))
114
+ end
115
+
116
+ it 'generates a uuid id' do
117
+ expect(entry[:id]).to match(/\A[0-9a-f-]{36}\z/)
118
+ end
119
+
120
+ it 'sets session_count to 0' do
121
+ expect(entry[:session_count]).to eq(0)
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::Apprenticeship do
4
+ let(:appr) do
5
+ described_class.new(
6
+ skill_name: 'ruby',
7
+ domain: 'programming',
8
+ mentor_id: 'mentor-1',
9
+ apprentice_id: 'apprentice-1'
10
+ )
11
+ end
12
+
13
+ describe '#initialize' do
14
+ it 'sets skill_name' do
15
+ expect(appr.skill_name).to eq('ruby')
16
+ end
17
+
18
+ it 'sets domain' do
19
+ expect(appr.domain).to eq('programming')
20
+ end
21
+
22
+ it 'starts at DEFAULT_MASTERY' do
23
+ expect(appr.mastery).to eq(Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel::DEFAULT_MASTERY)
24
+ end
25
+
26
+ it 'starts with zero sessions' do
27
+ expect(appr.session_count).to eq(0)
28
+ end
29
+
30
+ it 'generates a uuid' do
31
+ expect(appr.id).to match(/\A[0-9a-f-]{36}\z/)
32
+ end
33
+ end
34
+
35
+ describe '#current_phase' do
36
+ it 'returns :modeling at default mastery' do
37
+ expect(appr.current_phase).to eq(:modeling)
38
+ end
39
+ end
40
+
41
+ describe '#mastery_label' do
42
+ it 'returns :novice at default mastery' do
43
+ expect(appr.mastery_label).to eq(:novice)
44
+ end
45
+ end
46
+
47
+ describe '#graduated?' do
48
+ it 'returns false below threshold' do
49
+ expect(appr.graduated?).to be false
50
+ end
51
+
52
+ it 'returns true at threshold' do
53
+ 30.times { appr.learn!(method: :exploration, success: true) }
54
+ expect(appr.graduated?).to be true
55
+ end
56
+ end
57
+
58
+ describe '#recommended_method' do
59
+ it 'returns :modeling at default mastery' do
60
+ expect(appr.recommended_method).to eq(:modeling)
61
+ end
62
+ end
63
+
64
+ describe '#learn!' do
65
+ it 'increases mastery on success' do
66
+ before = appr.mastery
67
+ appr.learn!(method: :modeling, success: true)
68
+ expect(appr.mastery).to be > before
69
+ end
70
+
71
+ it 'does not increase mastery on failure' do
72
+ before = appr.mastery
73
+ appr.learn!(method: :modeling, success: false)
74
+ expect(appr.mastery).to eq(before)
75
+ end
76
+
77
+ it 'applies exploration multiplier' do
78
+ a1 = described_class.new(skill_name: 'skill', domain: 'dom', mentor_id: 'mtr', apprentice_id: 'app')
79
+ a2 = described_class.new(skill_name: 'skill', domain: 'dom', mentor_id: 'mtr', apprentice_id: 'app')
80
+ a1.learn!(method: :modeling, success: true)
81
+ a2.learn!(method: :exploration, success: true)
82
+ expect(a2.mastery).to be > a1.mastery
83
+ end
84
+
85
+ it 'applies coaching multiplier' do
86
+ a1 = described_class.new(skill_name: 'skill', domain: 'dom', mentor_id: 'mtr', apprentice_id: 'app')
87
+ a2 = described_class.new(skill_name: 'skill', domain: 'dom', mentor_id: 'mtr', apprentice_id: 'app')
88
+ a1.learn!(method: :modeling, success: true)
89
+ a2.learn!(method: :coaching, success: true)
90
+ expect(a2.mastery).to be > a1.mastery
91
+ end
92
+
93
+ it 'increments session_count' do
94
+ appr.learn!(method: :scaffolding, success: true)
95
+ expect(appr.session_count).to eq(1)
96
+ end
97
+
98
+ it 'clamps mastery at ceiling' do
99
+ 100.times { appr.learn!(method: :exploration, success: true) }
100
+ expect(appr.mastery).to be <= 1.0
101
+ end
102
+
103
+ it 'updates last_session_at' do
104
+ appr.learn!(method: :reflection, success: true)
105
+ expect(appr.last_session_at).not_to be_nil
106
+ end
107
+ end
108
+
109
+ describe '#decay!' do
110
+ it 'reduces mastery' do
111
+ appr.learn!(method: :exploration, success: true)
112
+ before = appr.mastery
113
+ appr.decay!
114
+ expect(appr.mastery).to be < before
115
+ end
116
+
117
+ it 'clamps at floor' do
118
+ 100.times { appr.decay! }
119
+ expect(appr.mastery).to be >= 0.0
120
+ end
121
+ end
122
+
123
+ describe '#to_h' do
124
+ it 'includes all expected keys' do
125
+ h = appr.to_h
126
+ expect(h).to include(:id, :skill_name, :domain, :mentor_id, :apprentice_id,
127
+ :mastery, :current_phase, :mastery_label, :graduated,
128
+ :session_count, :created_at, :last_session_at)
129
+ end
130
+
131
+ it 'reflects graduated status' do
132
+ 30.times { appr.learn!(method: :exploration, success: true) }
133
+ expect(appr.to_h[:graduated]).to be true
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/apprenticeship/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Social::Apprenticeship::Runners::CognitiveApprenticeship do
6
+ let(:client) { Legion::Extensions::Agentic::Social::Apprenticeship::Client.new }
7
+
8
+ let(:valid_params) do
9
+ {
10
+ skill_name: 'ruby',
11
+ domain: 'programming',
12
+ mentor_id: 'mentor-1',
13
+ apprentice_id: 'learner-1'
14
+ }
15
+ end
16
+
17
+ def create_one
18
+ client.create_apprenticeship(**valid_params)
19
+ end
20
+
21
+ describe '#create_apprenticeship' do
22
+ it 'returns success: true with a valid apprenticeship hash' do
23
+ result = create_one
24
+ expect(result[:success]).to be true
25
+ expect(result[:apprenticeship]).to include(:id, :skill_name, :mastery)
26
+ end
27
+
28
+ it 'returns success: false when a param is too short' do
29
+ result = client.create_apprenticeship(skill_name: 'ab', domain: 'dom', mentor_id: 'mtr', apprentice_id: 'app')
30
+ expect(result[:success]).to be false
31
+ expect(result[:reason]).to eq(:param_too_short)
32
+ end
33
+ end
34
+
35
+ describe '#conduct_apprenticeship_session' do
36
+ it 'returns success: true and updated mastery' do
37
+ created = create_one
38
+ id = created[:apprenticeship][:id]
39
+ result = client.conduct_apprenticeship_session(apprenticeship_id: id, method: :modeling, success: true)
40
+ expect(result[:success]).to be true
41
+ expect(result[:apprenticeship][:mastery]).to be > 0.1
42
+ end
43
+
44
+ it 'returns success: false for unknown apprenticeship' do
45
+ result = client.conduct_apprenticeship_session(apprenticeship_id: 'nope', method: :modeling, success: true)
46
+ expect(result[:success]).to be false
47
+ expect(result[:reason]).to eq(:not_found)
48
+ end
49
+
50
+ it 'returns success: false for invalid method' do
51
+ created = create_one
52
+ id = created[:apprenticeship][:id]
53
+ result = client.conduct_apprenticeship_session(apprenticeship_id: id, method: :unknown, success: true)
54
+ expect(result[:success]).to be false
55
+ expect(result[:reason]).to eq(:invalid_method)
56
+ end
57
+
58
+ it 'accepts all six valid methods' do
59
+ Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel::METHODS.each do |method|
60
+ c = Legion::Extensions::Agentic::Social::Apprenticeship::Client.new
61
+ created = c.create_apprenticeship(**valid_params)
62
+ id = created[:apprenticeship][:id]
63
+ result = c.conduct_apprenticeship_session(apprenticeship_id: id, method: method, success: true)
64
+ expect(result[:success]).to be true
65
+ end
66
+ end
67
+ end
68
+
69
+ describe '#recommend_apprenticeship_method' do
70
+ it 'returns success: true with a valid method' do
71
+ created = create_one
72
+ id = created[:apprenticeship][:id]
73
+ result = client.recommend_apprenticeship_method(apprenticeship_id: id)
74
+ expect(result[:success]).to be true
75
+ expect(Legion::Extensions::Agentic::Social::Apprenticeship::Helpers::ApprenticeshipModel::METHODS).to include(result[:recommended_method])
76
+ end
77
+
78
+ it 'returns success: false for unknown apprenticeship' do
79
+ result = client.recommend_apprenticeship_method(apprenticeship_id: 'nope')
80
+ expect(result[:success]).to be false
81
+ end
82
+ end
83
+
84
+ describe '#graduated_apprenticeships' do
85
+ it 'returns success: true and an empty list initially' do
86
+ result = client.graduated_apprenticeships
87
+ expect(result[:success]).to be true
88
+ expect(result[:count]).to eq(0)
89
+ end
90
+
91
+ it 'includes graduated apprenticeships' do
92
+ created = create_one
93
+ id = created[:apprenticeship][:id]
94
+ 30.times { client.conduct_apprenticeship_session(apprenticeship_id: id, method: :exploration, success: true) }
95
+ result = client.graduated_apprenticeships
96
+ expect(result[:count]).to eq(1)
97
+ end
98
+ end
99
+
100
+ describe '#active_apprenticeships' do
101
+ it 'returns the newly created apprenticeship' do
102
+ create_one
103
+ result = client.active_apprenticeships
104
+ expect(result[:success]).to be true
105
+ expect(result[:count]).to eq(1)
106
+ end
107
+ end
108
+
109
+ describe '#mentor_apprenticeships' do
110
+ it 'returns apprenticeships for the mentor' do
111
+ create_one
112
+ result = client.mentor_apprenticeships(mentor_id: 'mentor-1')
113
+ expect(result[:success]).to be true
114
+ expect(result[:count]).to eq(1)
115
+ end
116
+ end
117
+
118
+ describe '#apprentice_apprenticeships' do
119
+ it 'returns apprenticeships for the apprentice' do
120
+ create_one
121
+ result = client.apprentice_apprenticeships(apprentice_id: 'learner-1')
122
+ expect(result[:success]).to be true
123
+ expect(result[:count]).to eq(1)
124
+ end
125
+ end
126
+
127
+ describe '#domain_apprenticeships' do
128
+ it 'returns apprenticeships for the domain' do
129
+ create_one
130
+ result = client.domain_apprenticeships(domain: 'programming')
131
+ expect(result[:success]).to be true
132
+ expect(result[:count]).to eq(1)
133
+ end
134
+ end
135
+
136
+ describe '#update_cognitive_apprenticeship' do
137
+ it 'delegates to conduct_apprenticeship_session' do
138
+ created = create_one
139
+ id = created[:apprenticeship][:id]
140
+ result = client.update_cognitive_apprenticeship(apprenticeship_id: id, method: :coaching, success: true)
141
+ expect(result[:success]).to be true
142
+ end
143
+ end
144
+
145
+ describe '#cognitive_apprenticeship_stats' do
146
+ it 'returns success: true with stats' do
147
+ create_one
148
+ result = client.cognitive_apprenticeship_stats
149
+ expect(result[:success]).to be true
150
+ expect(result[:total]).to eq(1)
151
+ expect(result).to include(:active, :graduated, :sessions)
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Actors
6
+ class Every; end # rubocop:disable Lint/EmptyClass
7
+ end
8
+ end
9
+ end
10
+
11
+ $LOADED_FEATURES << 'legion/extensions/actors/every'
12
+
13
+ require_relative '../../../../../../../lib/legion/extensions/agentic/social/conflict/actors/stale_check'
14
+
15
+ RSpec.describe Legion::Extensions::Agentic::Social::Conflict::Actor::StaleCheck do
16
+ subject(:actor) { described_class.new }
17
+
18
+ describe '#runner_class' do
19
+ it { expect(actor.runner_class).to eq Legion::Extensions::Agentic::Social::Conflict::Runners::Conflict }
20
+ end
21
+
22
+ describe '#runner_function' do
23
+ it { expect(actor.runner_function).to eq 'check_stale_conflicts' }
24
+ end
25
+
26
+ describe '#time' do
27
+ it { expect(actor.time).to eq 3600 }
28
+ end
29
+
30
+ describe '#run_now?' do
31
+ it { expect(actor.run_now?).to be false }
32
+ end
33
+
34
+ describe '#use_runner?' do
35
+ it { expect(actor.use_runner?).to be false }
36
+ end
37
+
38
+ describe '#check_subtask?' do
39
+ it { expect(actor.check_subtask?).to be false }
40
+ end
41
+
42
+ describe '#generate_task?' do
43
+ it { expect(actor.generate_task?).to be false }
44
+ end
45
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/social/conflict/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Social::Conflict::Client do
6
+ it 'responds to conflict runner methods' do
7
+ client = described_class.new
8
+ expect(client).to respond_to(:register_conflict)
9
+ expect(client).to respond_to(:add_exchange)
10
+ expect(client).to respond_to(:resolve_conflict)
11
+ expect(client).to respond_to(:get_conflict)
12
+ expect(client).to respond_to(:active_conflicts)
13
+ expect(client).to respond_to(:recommended_posture)
14
+ end
15
+ end