lex-synapse 0.3.0 → 0.3.2
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 +4 -4
- data/CHANGELOG.md +10 -0
- data/CLAUDE.md +2 -2
- data/README.md +1 -1
- data/lib/legion/extensions/synapse/actors/homeostasis.rb +28 -14
- data/lib/legion/extensions/synapse/helpers/confidence.rb +3 -1
- data/lib/legion/extensions/synapse/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4373abd3a8ec4e508cd8d276b77fc185b667c51e7a54f389313c8b2aa3f353c4
|
|
4
|
+
data.tar.gz: 97df6f4f7fbef9db59155ef5aeea11636ad0c58fb82bc30a38c1f71207db39bf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e36c0ef72aa48a0315c12868ec48602ca0b91adf46c842e75da5279799daaefb49b4c80bf2d28f6af8c4ef8b6db334d491e98bf33c9877f32809bafdf0b97c56
|
|
7
|
+
data.tar.gz: 8570e52cee80e41d5dfc0a1c2de4a642210c471d8a4f59386e87d687815804fc22e7d73c8de1d43c31a58263876d8f44f3e3515c12e4861b6dfd1447d4414eec
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.2] - 2026-03-21
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Homeostasis actor converted to self-contained pattern — was referencing non-existent `Runners::Homeostasis` and `check_homeostasis` method, now implements `action` directly using `Helpers::Homeostasis` spike/drought checks
|
|
7
|
+
|
|
8
|
+
## [0.3.1] - 2026-03-20
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Emit `synapse.confidence_update` event on confidence adjustment for safety metrics
|
|
12
|
+
|
|
3
13
|
## [0.3.0] - 2026-03-19
|
|
4
14
|
|
|
5
15
|
### Added
|
data/CLAUDE.md
CHANGED
|
@@ -110,11 +110,11 @@ Legion::Extensions::Synapse
|
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
112
|
bundle install
|
|
113
|
-
bundle exec rspec #
|
|
113
|
+
bundle exec rspec # 353 specs, 0 failures
|
|
114
114
|
bundle exec rubocop # 0 offenses
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
353 specs, 95%+ coverage. Uses in-memory SQLite for model/runner tests.
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
data/README.md
CHANGED
|
@@ -146,7 +146,7 @@ Three tables: `synapses` (core routing definition + confidence + status), `synap
|
|
|
146
146
|
## Dependencies
|
|
147
147
|
|
|
148
148
|
- `lex-conditioner` >= 0.3.0
|
|
149
|
-
- `lex-transformer` >= 0.
|
|
149
|
+
- `lex-transformer` >= 0.3.0
|
|
150
150
|
- Ruby >= 3.4
|
|
151
151
|
- [LegionIO](https://github.com/LegionIO/LegionIO) framework (for AMQP actor mode)
|
|
152
152
|
- Standalone Client works without the framework (requires Sequel + database)
|
|
@@ -5,24 +5,38 @@ module Legion
|
|
|
5
5
|
module Synapse
|
|
6
6
|
module Actor
|
|
7
7
|
class Homeostasis < Legion::Extensions::Actors::Every
|
|
8
|
-
def
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
def runner_class = self.class
|
|
9
|
+
def time = 30
|
|
10
|
+
def use_runner? = false
|
|
11
|
+
def check_subtask? = false
|
|
12
|
+
def generate_task? = false
|
|
11
13
|
|
|
12
|
-
def
|
|
13
|
-
|
|
14
|
-
end
|
|
14
|
+
def action(**_opts)
|
|
15
|
+
return { status: :skipped, reason: :no_data } unless defined?(Legion::Data)
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
end
|
|
17
|
+
results = { spikes: 0, droughts: 0, updated: 0 }
|
|
18
|
+
return results unless defined?(Legion::Extensions::Synapse::Data::Model::Synapse)
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
Legion::Extensions::Synapse::Data::Model::Synapse
|
|
21
|
+
.where(status: 'active')
|
|
22
|
+
.where { baseline_throughput > 0 } # rubocop:disable Style/NumericPredicate
|
|
23
|
+
.each do |synapse|
|
|
24
|
+
baseline = synapse.baseline_throughput
|
|
25
|
+
signals = synapse.signals_dataset.where { created_at > (Time.now - 60) }.count
|
|
26
|
+
current = signals.to_f
|
|
27
|
+
|
|
28
|
+
if Helpers::Homeostasis.spike?(current, baseline, duration_seconds: 60)
|
|
29
|
+
results[:spikes] += 1
|
|
30
|
+
elsif Helpers::Homeostasis.drought?(current, baseline, silent_seconds: 60)
|
|
31
|
+
results[:droughts] += 1
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
new_baseline = Helpers::Homeostasis.update_baseline(baseline, current)
|
|
35
|
+
synapse.update(baseline_throughput: new_baseline)
|
|
36
|
+
results[:updated] += 1
|
|
37
|
+
end
|
|
23
38
|
|
|
24
|
-
|
|
25
|
-
false
|
|
39
|
+
results
|
|
26
40
|
end
|
|
27
41
|
end
|
|
28
42
|
end
|
|
@@ -36,7 +36,9 @@ module Legion
|
|
|
36
36
|
delta = ADJUSTMENTS.fetch(event, 0)
|
|
37
37
|
result = confidence + delta
|
|
38
38
|
result += ADJUSTMENTS[:consecutive_bonus] if event == :success && consecutive_successes > CONSECUTIVE_BONUS_THRESHOLD
|
|
39
|
-
clamp(result)
|
|
39
|
+
new_confidence = clamp(result)
|
|
40
|
+
Legion::Events.emit('synapse.confidence_update', delta: delta, event: event, new_confidence: new_confidence) if defined?(Legion::Events)
|
|
41
|
+
new_confidence
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
def decay(confidence, hours: 1)
|