lex-synapse 0.4.1 → 0.4.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a9d8a3b5e13c6470c2170ca639e04e1fc8aedc0d596ff709ec9324334374e51
4
- data.tar.gz: ecc92ce72c7ec61129495e1b290dbfb1e5df7353c6ce8b9a9ef974f146fbfa9f
3
+ metadata.gz: 8344eb31eac2aa068d8d33f98797e7e35c19d02a2fe1aac8abf612e17bdd05e5
4
+ data.tar.gz: ccd61928b4c8bf0e2f94fdfa06c1f568c59e07ad00767f1c82baea823d7924c3
5
5
  SHA512:
6
- metadata.gz: bf1e6f5ffe926a283d8e5278cc12546e57e3183b8893604c7b20ca81a57e2b5b571b28ce6448370e4e24576ff62dc55916a5080fd864e67e3814951f93b5ed69
7
- data.tar.gz: 7995dee982eda776e8f847ba73202131a5c5fb01f0198193ef9dd5f3bed7d45677be196a76a65b19d4518bd3f41265ddb5622c587cced160cd94164d59771793
6
+ metadata.gz: 37f95b2688000a6ef9219fc0e1de0708d12719b2df5d4043888e3b8e8cd1cde4a6daca0e0ff7967496218b500fb0660b4b534200784460d524faf33f9d83b9f5
7
+ data.tar.gz: f8b9c2ff7130b61ed862a958d96fe236f0aecfeafe4f18429ea6d4c6d2fa7997c24d759d3227764fc633fb11e062779f90237d7e90681563c6a9fc897a04a837
data/CHANGELOG.md CHANGED
@@ -1,9 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.3] - 2026-03-22
4
+
5
+ ### Fixed
6
+ - Race condition in lazy model definition: concurrent threads could both pass `const_defined?` before either called `const_set`, producing "already initialized constant" warnings. Added shared mutex to all 5 `define_*_model` methods.
7
+
8
+ ## [0.4.2] - 2026-03-22
9
+
10
+ ### Fixed
11
+ - Add `include Helpers::Lex` to Crystallize, Challenge, Evaluate, Pain, and Propose runners so methods are callable at module level by framework actor auto-dispatch
12
+
3
13
  ## [0.4.1] - 2026-03-22
4
14
 
5
15
  ### Fixed
6
- - Challenge and Propose actors now include their runner modules and override `runner_class` to return `self.class`, fixing `NoMethodError: undefined method 'run_challenge_cycle'` at runtime
16
+ - Challenge, Propose, and Crystallize actors now include their runner modules and override `runner_class` to return `self.class`, fixing `NoMethodError` at runtime
17
+ - Decay actor converted to self-contained pattern (like Homeostasis) — no `Runners::Decay` module existed
7
18
 
8
19
  ## [0.4.0] - 2026-03-22
9
20
 
@@ -1,10 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../runners/crystallize'
4
+
3
5
  module Legion
4
6
  module Extensions
5
7
  module Synapse
6
8
  module Actor
7
9
  class Crystallize < Legion::Extensions::Actors::Every
10
+ include Legion::Extensions::Synapse::Runners::Crystallize
11
+
12
+ def runner_class = self.class
13
+
8
14
  def runner_function
9
15
  'crystallize'
10
16
  end
@@ -5,24 +5,27 @@ module Legion
5
5
  module Synapse
6
6
  module Actor
7
7
  class Decay < Legion::Extensions::Actors::Every
8
- def runner_function
9
- 'apply_decay'
10
- end
8
+ def runner_class = self.class
9
+ def time = 3600
10
+ def use_runner? = false
11
+ def check_subtask? = false
12
+ def generate_task? = false
11
13
 
12
- def time
13
- 3600
14
- end
14
+ def action(**_opts)
15
+ return { status: :skipped, reason: :no_data } unless defined?(Legion::Data)
15
16
 
16
- def use_runner?
17
- false
18
- end
17
+ Data::Model.define_synapse_model
18
+ decayed = 0
19
19
 
20
- def check_subtask?
21
- false
22
- end
20
+ Data::Model::Synapse.where(status: 'active').each do |synapse|
21
+ new_conf = Helpers::Confidence.decay(synapse.confidence, hours: 1)
22
+ next if new_conf == synapse.confidence
23
+
24
+ synapse.update(confidence: new_conf)
25
+ decayed += 1
26
+ end
23
27
 
24
- def generate_task?
25
- false
28
+ { decayed: decayed }
26
29
  end
27
30
  end
28
31
  end
@@ -5,23 +5,27 @@ module Legion
5
5
  module Synapse
6
6
  module Data
7
7
  module Model
8
+ @define_mutex = Mutex.new
9
+
8
10
  def self.define_synapse_model
9
- return if const_defined?(:Synapse, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
+ @define_mutex.synchronize do
12
+ return if const_defined?(:Synapse, false)
13
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
14
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapses)
15
+ db = Sequel::Model.db
16
+ return unless db&.table_exists?(:synapses)
14
17
 
15
- klass = Class.new(Sequel::Model(:synapses)) do
16
- one_to_many :mutations, class: 'Legion::Extensions::Synapse::Data::Model::SynapseMutation',
17
- key: :synapse_id
18
- one_to_many :signals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseSignal',
19
- key: :synapse_id
20
- one_to_many :proposals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
21
- key: :synapse_id
18
+ klass = Class.new(Sequel::Model(:synapses)) do
19
+ one_to_many :mutations, class: 'Legion::Extensions::Synapse::Data::Model::SynapseMutation',
20
+ key: :synapse_id
21
+ one_to_many :signals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseSignal',
22
+ key: :synapse_id
23
+ one_to_many :proposals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
24
+ key: :synapse_id
25
+ end
26
+ klass.set_primary_key :id
27
+ const_set(:Synapse, klass)
22
28
  end
23
- klass.set_primary_key :id
24
- const_set(:Synapse, klass)
25
29
  end
26
30
  end
27
31
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_challenge_model
9
- return if const_defined?(:SynapseChallenge, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseChallenge, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_challenges)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_challenges)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_challenges)) do
16
- many_to_one :proposal, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
17
- key: :proposal_id
16
+ klass = Class.new(Sequel::Model(:synapse_challenges)) do
17
+ many_to_one :proposal, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
18
+ key: :proposal_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseChallenge, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseChallenge, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_mutation_model
9
- return if const_defined?(:SynapseMutation, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseMutation, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_mutations)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_mutations)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_mutations)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_mutations)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseMutation, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseMutation, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_proposal_model
9
- return if const_defined?(:SynapseProposal, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseProposal, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_proposals)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_proposals)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_proposals)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_proposals)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseProposal, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseProposal, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_signal_model
9
- return if const_defined?(:SynapseSignal, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseSignal, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_signals)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_signals)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_signals)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_signals)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseSignal, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseSignal, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -242,6 +242,8 @@ module Legion
242
242
 
243
243
  recent.first.challenger_confidence
244
244
  end
245
+
246
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
245
247
  end
246
248
  end
247
249
  end
@@ -39,6 +39,8 @@ module Legion
39
39
  target_function_id: target_id
40
40
  ).any?
41
41
  end
42
+
43
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
42
44
  end
43
45
  end
44
46
  end
@@ -112,6 +112,8 @@ module Legion
112
112
  latency_ms: latency_ms.to_i
113
113
  )
114
114
  end
115
+
116
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
115
117
  end
116
118
  end
117
119
  end
@@ -73,6 +73,8 @@ module Legion
73
73
  baseline_signals = [synapse.baseline_throughput * 5, 5].max
74
74
  recent > (baseline_signals * 2)
75
75
  end
76
+
77
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
76
78
  end
77
79
  end
78
80
  end
@@ -246,6 +246,8 @@ module Legion
246
246
  "There have been #{recent_failures.size} downstream failures despite attention passing. " \
247
247
  'Suggest refined attention rules as a JSON condition object. Return only JSON.'
248
248
  end
249
+
250
+ include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
249
251
  end
250
252
  end
251
253
  end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Synapse
6
- VERSION = '0.4.1'
6
+ VERSION = '0.4.3'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-synapse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity