lex-synapse 0.2.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 +7 -0
- data/.github/workflows/ci.yml +16 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +53 -0
- data/CHANGELOG.md +36 -0
- data/CLAUDE.md +98 -0
- data/Gemfile +16 -0
- data/README.md +156 -0
- data/Rakefile +7 -0
- data/lex-synapse.gemspec +31 -0
- data/lib/legion/extensions/synapse/actors/crystallize.rb +31 -0
- data/lib/legion/extensions/synapse/actors/decay.rb +31 -0
- data/lib/legion/extensions/synapse/actors/evaluate.rb +23 -0
- data/lib/legion/extensions/synapse/actors/homeostasis.rb +31 -0
- data/lib/legion/extensions/synapse/actors/pain.rb +23 -0
- data/lib/legion/extensions/synapse/client.rb +62 -0
- data/lib/legion/extensions/synapse/data/migrations/001_create_synapses.rb +26 -0
- data/lib/legion/extensions/synapse/data/migrations/002_create_synapse_mutations.rb +21 -0
- data/lib/legion/extensions/synapse/data/migrations/003_create_synapse_signals.rb +20 -0
- data/lib/legion/extensions/synapse/data/models/synapse.rb +16 -0
- data/lib/legion/extensions/synapse/data/models/synapse_mutation.rb +15 -0
- data/lib/legion/extensions/synapse/data/models/synapse_signal.rb +15 -0
- data/lib/legion/extensions/synapse/helpers/confidence.rb +75 -0
- data/lib/legion/extensions/synapse/helpers/homeostasis.rb +43 -0
- data/lib/legion/extensions/synapse/helpers/relationship_wrapper.rb +42 -0
- data/lib/legion/extensions/synapse/runners/crystallize.rb +45 -0
- data/lib/legion/extensions/synapse/runners/dream.rb +106 -0
- data/lib/legion/extensions/synapse/runners/evaluate.rb +101 -0
- data/lib/legion/extensions/synapse/runners/gaia_report.rb +68 -0
- data/lib/legion/extensions/synapse/runners/mutate.rb +67 -0
- data/lib/legion/extensions/synapse/runners/pain.rb +78 -0
- data/lib/legion/extensions/synapse/runners/promote.rb +79 -0
- data/lib/legion/extensions/synapse/runners/report.rb +50 -0
- data/lib/legion/extensions/synapse/runners/retrieve.rb +61 -0
- data/lib/legion/extensions/synapse/runners/revert.rb +58 -0
- data/lib/legion/extensions/synapse/transport/exchanges/synapse.rb +16 -0
- data/lib/legion/extensions/synapse/transport/messages/pain.rb +23 -0
- data/lib/legion/extensions/synapse/transport/messages/signal.rb +23 -0
- data/lib/legion/extensions/synapse/transport/queues/evaluate.rb +19 -0
- data/lib/legion/extensions/synapse/transport/queues/pain.rb +19 -0
- data/lib/legion/extensions/synapse/transport.rb +18 -0
- data/lib/legion/extensions/synapse/version.rb +9 -0
- data/lib/legion/extensions/synapse.rb +20 -0
- metadata +118 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: c1961edd72029f290abdb673e1a4b23736cdc52b963d11243e4f47e4f38c65f1
|
|
4
|
+
data.tar.gz: 83be98e416e226e960e331fa24c197f99ff236cc419ea5afd26b050ee6e09fcd
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: ef8000741910d6a3532cafb21a4c82924e17067359609524d41df993947677bc7fe6f505f3230cbdc94a89cca0c6a8e3db7a026a77aed2a4edb5f1a43030c227
|
|
7
|
+
data.tar.gz: 86fccd6c3ecb7f4a43c0a5030c21a82af341ea50fc7e0b4e334ef77718c637358018a5fca556361ab2a26c2870879db1d54eb91505a947b9fbf3779aa05f16a4
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
ci:
|
|
9
|
+
uses: LegionIO/.github/.github/workflows/ci.yml@main
|
|
10
|
+
|
|
11
|
+
release:
|
|
12
|
+
needs: ci
|
|
13
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
14
|
+
uses: LegionIO/.github/.github/workflows/release.yml@main
|
|
15
|
+
secrets:
|
|
16
|
+
rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
TargetRubyVersion: 3.4
|
|
3
|
+
NewCops: enable
|
|
4
|
+
SuggestExtensions: false
|
|
5
|
+
|
|
6
|
+
Layout/LineLength:
|
|
7
|
+
Max: 160
|
|
8
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
|
9
|
+
EnforcedStyle: space
|
|
10
|
+
Layout/HashAlignment:
|
|
11
|
+
EnforcedHashRocketStyle: table
|
|
12
|
+
EnforcedColonStyle: table
|
|
13
|
+
|
|
14
|
+
Metrics/MethodLength:
|
|
15
|
+
Max: 50
|
|
16
|
+
Metrics/ClassLength:
|
|
17
|
+
Max: 1500
|
|
18
|
+
Metrics/ModuleLength:
|
|
19
|
+
Max: 1500
|
|
20
|
+
Metrics/BlockLength:
|
|
21
|
+
Max: 40
|
|
22
|
+
Exclude:
|
|
23
|
+
- 'spec/**/*'
|
|
24
|
+
Metrics/AbcSize:
|
|
25
|
+
Max: 60
|
|
26
|
+
Metrics/CyclomaticComplexity:
|
|
27
|
+
Max: 15
|
|
28
|
+
Metrics/PerceivedComplexity:
|
|
29
|
+
Max: 17
|
|
30
|
+
Metrics/ParameterLists:
|
|
31
|
+
Enabled: false
|
|
32
|
+
|
|
33
|
+
Style/Documentation:
|
|
34
|
+
Enabled: false
|
|
35
|
+
Style/SymbolArray:
|
|
36
|
+
Enabled: true
|
|
37
|
+
Style/FrozenStringLiteralComment:
|
|
38
|
+
Enabled: true
|
|
39
|
+
EnforcedStyle: always
|
|
40
|
+
|
|
41
|
+
Naming/FileName:
|
|
42
|
+
Enabled: false
|
|
43
|
+
Naming/PredicateMethod:
|
|
44
|
+
Enabled: false
|
|
45
|
+
Naming/PredicatePrefix:
|
|
46
|
+
Enabled: false
|
|
47
|
+
|
|
48
|
+
Gemspec/DevelopmentDependencies:
|
|
49
|
+
Enabled: false
|
|
50
|
+
|
|
51
|
+
Lint/EmptyClass:
|
|
52
|
+
Exclude:
|
|
53
|
+
- 'spec/**/*'
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.2.2] - 2026-03-18
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Remove local path references from Gemfile (lex-conditioner, lex-transformer)
|
|
7
|
+
|
|
8
|
+
## [0.2.1] - 2026-03-18
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Extract VALID_STATUSES, EVALUABLE_STATUSES, VALID_ORIGINS, VALID_OUTCOMES constants into Confidence module
|
|
12
|
+
- Replace inline status array in Evaluate#evaluate with EVALUABLE_STATUSES constant reference
|
|
13
|
+
|
|
14
|
+
## [0.2.0] - 2026-03-17
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- `Runners::GaiaReport` with `gaia_summary` (tick-consumable stats) and `gaia_reflection` (mutation tally + summary for post-tick)
|
|
18
|
+
- `Runners::Dream` with `dream_replay` (read-only mutation timeline) and `dream_simulate` (what-if without modifying state)
|
|
19
|
+
- `Runners::Promote` pushes high-confidence synapse patterns to Apollo (threshold: confidence >= 0.9, no reverts in 24h)
|
|
20
|
+
- `Runners::Retrieve` seeds new synapses from Apollo knowledge entries (threshold: entry confidence >= 0.7)
|
|
21
|
+
- Client includes all 4 new runner modules
|
|
22
|
+
- 92 new specs (303 total), 96% coverage
|
|
23
|
+
|
|
24
|
+
## [0.1.0] - 2026-03-17
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
- Cognitive routing layer for LegionIO task chains
|
|
28
|
+
- Data model: `synapses`, `synapse_mutations`, `synapse_signals` tables with Sequel migrations
|
|
29
|
+
- Confidence scoring: starting scores by origin (explicit=0.7, emergent=0.3, seeded=0.5), event-based adjustments, idle decay, autonomy ranges (OBSERVE/FILTER/TRANSFORM/AUTONOMOUS)
|
|
30
|
+
- Homeostasis: spike detection (>3x baseline for 60s), drought detection (0 throughput for 10x avg interval), exponential moving average baseline tracking
|
|
31
|
+
- 6 core runners: evaluate (attention+transform+route+record), pain (failure handling, auto-revert), crystallize (emergent synapse creation), mutate (versioned self-modification), revert (rollback to previous version), report (aggregated stats)
|
|
32
|
+
- 5 actors: evaluate (subscription), pain (subscription), crystallize (every 5min), homeostasis (every 30s), decay (every 1hr)
|
|
33
|
+
- Transport layer: synapse exchange, evaluate/pain queues, signal/pain messages
|
|
34
|
+
- Standalone `Client` class with injected conditioner/transformer clients
|
|
35
|
+
- `RelationshipWrapper` helper for wrapping Layer 1 relationships as synapses
|
|
36
|
+
- 211 specs, 94%+ coverage
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# lex-synapse: Cognitive Routing Layer for LegionIO
|
|
2
|
+
|
|
3
|
+
**Repository Level 3 Documentation**
|
|
4
|
+
- **Parent**: `/Users/miverso2/rubymine/legion/extensions-core/CLAUDE.md`
|
|
5
|
+
- **Grandparent**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Cognitive routing layer that wraps task chain relationships with observation, learning, confidence scoring, pain signals, homeostasis, and self-governance. Sits between Layer 1 (explicit user-defined relationships in lex-tasker) and Layer 3 (GAIA cognitive coordination + Apollo shared knowledge).
|
|
10
|
+
|
|
11
|
+
**GitHub**: https://github.com/LegionIO/lex-synapse
|
|
12
|
+
**License**: MIT
|
|
13
|
+
**Version**: 0.2.2
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Legion::Extensions::Synapse
|
|
19
|
+
├── Actors/
|
|
20
|
+
│ ├── Evaluate # Subscription — main signal evaluation
|
|
21
|
+
│ ├── Pain # Subscription — task.failed handler
|
|
22
|
+
│ ├── Crystallize # Every 300s — emergent synapse detection
|
|
23
|
+
│ ├── Homeostasis # Every 30s — spike/drought monitoring
|
|
24
|
+
│ └── Decay # Every 3600s — idle confidence decay
|
|
25
|
+
├── Runners/
|
|
26
|
+
│ ├── Evaluate # attention -> transform -> route -> record
|
|
27
|
+
│ ├── Pain # failure recording, confidence hit, auto-revert
|
|
28
|
+
│ ├── Crystallize # unrouted traffic analysis, emergent creation
|
|
29
|
+
│ ├── Mutate # versioned self-modification with snapshots
|
|
30
|
+
│ ├── Revert # rollback to previous mutation version
|
|
31
|
+
│ └── Report # aggregate stats for GAIA consumption
|
|
32
|
+
├── Helpers/
|
|
33
|
+
│ ├── Confidence # scoring, adjustments, autonomy ranges, decay
|
|
34
|
+
│ ├── Homeostasis # spike/drought detection, baseline tracking
|
|
35
|
+
│ └── RelationshipWrapper # Layer 1 -> Layer 2 wrapping
|
|
36
|
+
├── Data/
|
|
37
|
+
│ ├── Migrations/ # 001 synapses, 002 mutations, 003 signals
|
|
38
|
+
│ └── Models/ # Synapse, SynapseMutation, SynapseSignal
|
|
39
|
+
├── Transport/
|
|
40
|
+
│ ├── Exchanges/Synapse
|
|
41
|
+
│ ├── Queues/Evaluate, Pain
|
|
42
|
+
│ └── Messages/Signal, Pain
|
|
43
|
+
└── Client # Standalone client including all runners
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Key Thresholds
|
|
47
|
+
|
|
48
|
+
| Parameter | Value |
|
|
49
|
+
|-----------|-------|
|
|
50
|
+
| Explicit starting confidence | 0.7 |
|
|
51
|
+
| Emergent starting confidence | 0.3 |
|
|
52
|
+
| Seeded starting confidence | 0.5 |
|
|
53
|
+
| Success adjustment | +0.02 |
|
|
54
|
+
| Failure adjustment | -0.05 |
|
|
55
|
+
| Validation failure adjustment | -0.03 |
|
|
56
|
+
| Consecutive success bonus (>50) | +0.05 |
|
|
57
|
+
| Idle decay rate | *0.998/hour |
|
|
58
|
+
| Auto-revert threshold | 3 consecutive failures |
|
|
59
|
+
| Spike multiplier | 3x baseline for 60s |
|
|
60
|
+
| Drought threshold | 0 throughput for 10x avg interval |
|
|
61
|
+
| Crystallize threshold | 20 unrouted signals |
|
|
62
|
+
|
|
63
|
+
## Autonomy Ranges
|
|
64
|
+
|
|
65
|
+
| Confidence | Mode | Capabilities |
|
|
66
|
+
|------------|------|-------------|
|
|
67
|
+
| 0.0-0.3 | OBSERVE | Log, pass through unchanged |
|
|
68
|
+
| 0.3-0.6 | FILTER | Suppress signals |
|
|
69
|
+
| 0.6-0.8 | TRANSFORM | Filter + transform within schemas |
|
|
70
|
+
| 0.8-1.0 | AUTONOMOUS | Self-modify rules, infer transforms |
|
|
71
|
+
|
|
72
|
+
## Data Model
|
|
73
|
+
|
|
74
|
+
- **synapses**: Core routing definition with confidence, status, version, baseline_throughput
|
|
75
|
+
- **synapse_mutations**: Versioned change history with before/after JSON snapshots
|
|
76
|
+
- **synapse_signals**: Per-signal outcome records (attention pass, transform success, latency, downstream outcome)
|
|
77
|
+
|
|
78
|
+
## Dependencies
|
|
79
|
+
|
|
80
|
+
| Gem | Purpose |
|
|
81
|
+
|-----|---------|
|
|
82
|
+
| `lex-conditioner` >= 0.3.0 | Attention evaluation (condition rules) |
|
|
83
|
+
| `lex-transformer` >= 0.2.0 | Payload transformation (template engines) |
|
|
84
|
+
| `legion-data` | Required — database persistence via Sequel |
|
|
85
|
+
|
|
86
|
+
## Testing
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
bundle install
|
|
90
|
+
bundle exec rspec
|
|
91
|
+
bundle exec rubocop
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
308 specs, 96%+ coverage. Uses in-memory SQLite for model/runner tests.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
**Maintained By**: Matthew Iverson (@Esity)
|
data/Gemfile
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
gemspec
|
|
6
|
+
|
|
7
|
+
group :test do
|
|
8
|
+
gem 'rake'
|
|
9
|
+
gem 'rspec', '~> 3.13'
|
|
10
|
+
gem 'rspec_junit_formatter'
|
|
11
|
+
gem 'rubocop', '~> 1.75'
|
|
12
|
+
gem 'rubocop-rspec'
|
|
13
|
+
gem 'sequel'
|
|
14
|
+
gem 'simplecov'
|
|
15
|
+
gem 'sqlite3'
|
|
16
|
+
end
|
data/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# lex-synapse
|
|
2
|
+
|
|
3
|
+
Cognitive routing layer for [LegionIO](https://github.com/LegionIO/LegionIO) task chains. Wraps task relationships with observation, learning, confidence scoring, pain signals, and self-governance.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
gem install lex-synapse
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or add to your Gemfile:
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'lex-synapse'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Standalone Client
|
|
18
|
+
|
|
19
|
+
Use the synapse engine without the full LegionIO framework:
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
require 'legion/extensions/synapse/client'
|
|
23
|
+
|
|
24
|
+
# Optionally inject conditioner and transformer clients
|
|
25
|
+
conditioner = Legion::Extensions::Conditioner::Client.new
|
|
26
|
+
transformer = Legion::Extensions::Transformer::Client.new
|
|
27
|
+
|
|
28
|
+
client = Legion::Extensions::Synapse::Client.new(
|
|
29
|
+
conditioner_client: conditioner,
|
|
30
|
+
transformer_client: transformer
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Create a synapse
|
|
34
|
+
synapse = client.create(
|
|
35
|
+
source_function_id: 1,
|
|
36
|
+
target_function_id: 2,
|
|
37
|
+
attention: '{"all":[{"fact":"status","operator":"equal","value":"open"}]}',
|
|
38
|
+
transform: '{"template":"{\"message\":\"<%= title %>\"}","engine":"erb"}'
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Evaluate a signal through the synapse
|
|
42
|
+
result = client.evaluate(synapse_id: synapse.id, payload: { status: 'open', title: 'Bug fix' })
|
|
43
|
+
result[:success] # => true
|
|
44
|
+
result[:mode] # => :transform (based on confidence level)
|
|
45
|
+
result[:result] # => { message: "Bug fix" }
|
|
46
|
+
|
|
47
|
+
# Get synapse stats
|
|
48
|
+
report = client.report(synapse_id: synapse.id)
|
|
49
|
+
report[:confidence] # => 0.72
|
|
50
|
+
report[:signals_24h] # => 1
|
|
51
|
+
report[:success_rate] # => 1.0
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Architecture
|
|
55
|
+
|
|
56
|
+
### Three-Layer Model
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Layer 1 (Bones) — Explicit relationships defined by users (lex-tasker)
|
|
60
|
+
Layer 2 (Nerves) — Synapses wrapping relationships with learning (lex-synapse)
|
|
61
|
+
Layer 3 (Mind) — GAIA cognitive coordination + Apollo shared knowledge (future)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Confidence Scoring
|
|
65
|
+
|
|
66
|
+
Each synapse has a confidence score (0.0-1.0) that governs what it's allowed to do:
|
|
67
|
+
|
|
68
|
+
| Range | Mode | Permitted Actions |
|
|
69
|
+
|-------|------|-------------------|
|
|
70
|
+
| 0.0-0.3 | OBSERVE | Log what it would do, pass through unchanged |
|
|
71
|
+
| 0.3-0.6 | FILTER | Can suppress signals, cannot modify |
|
|
72
|
+
| 0.6-0.8 | TRANSFORM | Can filter + transform within defined schemas |
|
|
73
|
+
| 0.8-1.0 | AUTONOMOUS | Can self-modify rules, infer transforms, adjust routing |
|
|
74
|
+
|
|
75
|
+
**Starting scores**: explicit=0.7, emergent=0.3, seeded=0.5
|
|
76
|
+
|
|
77
|
+
**Adjustments**: success +0.02, failure -0.05, validation failure -0.03, 50+ consecutive successes +0.05 bonus
|
|
78
|
+
|
|
79
|
+
**Decay**: Unused synapses fade at 0.998x per hour (~15% per day of inactivity)
|
|
80
|
+
|
|
81
|
+
### Pain Signals
|
|
82
|
+
|
|
83
|
+
Downstream task failures propagate backward through the chain:
|
|
84
|
+
- Each failure reduces confidence by 0.05
|
|
85
|
+
- 3+ consecutive failures trigger auto-revert to last known-good state
|
|
86
|
+
- Extreme failure rates trigger dampening (homeostasis)
|
|
87
|
+
|
|
88
|
+
### Homeostasis
|
|
89
|
+
|
|
90
|
+
- **Spike detection**: Throughput >3x baseline for 60+ seconds triggers dampening
|
|
91
|
+
- **Drought detection**: Zero throughput for 10x average interval flags for review
|
|
92
|
+
- **Baseline tracking**: Exponential moving average of signals/minute
|
|
93
|
+
|
|
94
|
+
## Runners
|
|
95
|
+
|
|
96
|
+
### Evaluate
|
|
97
|
+
`evaluate(synapse_id:, payload:, conditioner_client:, transformer_client:)`
|
|
98
|
+
|
|
99
|
+
Main signal flow: load synapse, check autonomy, run attention (conditioner), run transform (transformer), record signal, adjust confidence.
|
|
100
|
+
|
|
101
|
+
### Pain
|
|
102
|
+
`handle_pain(synapse_id:, task_id:)`
|
|
103
|
+
|
|
104
|
+
Downstream failure handler. Records failed signal, adjusts confidence, checks for auto-revert threshold, may dampen synapse.
|
|
105
|
+
|
|
106
|
+
### Crystallize
|
|
107
|
+
`crystallize(signal_pairs:, threshold: 20)`
|
|
108
|
+
|
|
109
|
+
Bottom-up emergence. Given pairs of `{source_function_id, target_function_id, count}`, creates new synapses for pairs exceeding the threshold.
|
|
110
|
+
|
|
111
|
+
### Mutate
|
|
112
|
+
`mutate(synapse_id:, mutation_type:, changes:, trigger:)`
|
|
113
|
+
|
|
114
|
+
Versioned self-modification. Records before/after state snapshots. Types: `attention_adjusted`, `transform_adjusted`, `route_changed`, `confidence_changed`. Triggers: `hebbian`, `pain`, `dream`, `gaia`, `manual`.
|
|
115
|
+
|
|
116
|
+
### Revert
|
|
117
|
+
`revert(synapse_id:, to_version:, trigger:)`
|
|
118
|
+
|
|
119
|
+
Rolls back to a previous mutation version, restoring the before_state.
|
|
120
|
+
|
|
121
|
+
### Report
|
|
122
|
+
`report(synapse_id:)`
|
|
123
|
+
|
|
124
|
+
Aggregates stats: confidence, status, 24h signal count, success rate, last mutation.
|
|
125
|
+
|
|
126
|
+
## Relationship Wrapper
|
|
127
|
+
|
|
128
|
+
Wrap existing Layer 1 relationships as synapses (opt-in, zero breaking changes):
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
relationship = { id: 42, trigger_function_id: 1, function_id: 2,
|
|
132
|
+
conditions: '{"all":[...]}', transformation: '{"template":"..."}' }
|
|
133
|
+
synapse = Legion::Extensions::Synapse::Helpers::RelationshipWrapper.wrap(relationship)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Transport
|
|
137
|
+
|
|
138
|
+
- **Exchange**: `synapse` (inherits from `Legion::Transport::Exchanges::Task`)
|
|
139
|
+
- **Queues**: `synapse.evaluate`, `synapse.pain`
|
|
140
|
+
- **Routing keys**: `synapse.evaluate`, `task.failed`
|
|
141
|
+
|
|
142
|
+
## Data Model
|
|
143
|
+
|
|
144
|
+
Three tables: `synapses` (core routing definition + confidence + status), `synapse_mutations` (versioned change history), `synapse_signals` (per-signal outcome records).
|
|
145
|
+
|
|
146
|
+
## Dependencies
|
|
147
|
+
|
|
148
|
+
- `lex-conditioner` >= 0.3.0
|
|
149
|
+
- `lex-transformer` >= 0.2.0
|
|
150
|
+
- Ruby >= 3.4
|
|
151
|
+
- [LegionIO](https://github.com/LegionIO/LegionIO) framework (for AMQP actor mode)
|
|
152
|
+
- Standalone Client works without the framework (requires Sequel + database)
|
|
153
|
+
|
|
154
|
+
## License
|
|
155
|
+
|
|
156
|
+
MIT
|
data/Rakefile
ADDED
data/lex-synapse.gemspec
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/legion/extensions/synapse/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'lex-synapse'
|
|
7
|
+
spec.version = Legion::Extensions::Synapse::VERSION
|
|
8
|
+
spec.authors = ['Esity']
|
|
9
|
+
spec.email = ['matthewdiverson@gmail.com']
|
|
10
|
+
|
|
11
|
+
spec.summary = 'Cognitive routing layer for LegionIO task chains'
|
|
12
|
+
spec.description = 'Attention, transformation, and routing with confidence scoring, pain signals, homeostasis, and self-governance'
|
|
13
|
+
spec.homepage = 'https://github.com/LegionIO/lex-synapse'
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
spec.required_ruby_version = '>= 3.4'
|
|
16
|
+
|
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-synapse'
|
|
19
|
+
spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-synapse'
|
|
20
|
+
spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-synapse/blob/main/CHANGELOG.md'
|
|
21
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-synapse/issues'
|
|
22
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
23
|
+
|
|
24
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
25
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
26
|
+
end
|
|
27
|
+
spec.require_paths = ['lib']
|
|
28
|
+
|
|
29
|
+
spec.add_dependency 'lex-conditioner', '>= 0.3.0'
|
|
30
|
+
spec.add_dependency 'lex-transformer', '>= 0.2.0'
|
|
31
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Synapse
|
|
6
|
+
module Actor
|
|
7
|
+
class Crystallize < Legion::Extensions::Actors::Every
|
|
8
|
+
def runner_function
|
|
9
|
+
'crystallize'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def time
|
|
13
|
+
300
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def use_runner?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_subtask?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def generate_task?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Synapse
|
|
6
|
+
module Actor
|
|
7
|
+
class Decay < Legion::Extensions::Actors::Every
|
|
8
|
+
def runner_function
|
|
9
|
+
'apply_decay'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def time
|
|
13
|
+
3600
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def use_runner?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_subtask?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def generate_task?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Synapse
|
|
6
|
+
module Actor
|
|
7
|
+
class Evaluate < Legion::Extensions::Actors::Subscription
|
|
8
|
+
def runner_function
|
|
9
|
+
'evaluate'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def check_subtask?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def generate_task?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Synapse
|
|
6
|
+
module Actor
|
|
7
|
+
class Homeostasis < Legion::Extensions::Actors::Every
|
|
8
|
+
def runner_function
|
|
9
|
+
'check_homeostasis'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def time
|
|
13
|
+
30
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def use_runner?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_subtask?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def generate_task?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Synapse
|
|
6
|
+
module Actor
|
|
7
|
+
class Pain < Legion::Extensions::Actors::Subscription
|
|
8
|
+
def runner_function
|
|
9
|
+
'handle_pain'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def check_subtask?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def generate_task?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'runners/evaluate'
|
|
4
|
+
require_relative 'runners/pain'
|
|
5
|
+
require_relative 'runners/crystallize'
|
|
6
|
+
require_relative 'runners/mutate'
|
|
7
|
+
require_relative 'runners/revert'
|
|
8
|
+
require_relative 'runners/report'
|
|
9
|
+
require_relative 'runners/gaia_report'
|
|
10
|
+
require_relative 'runners/dream'
|
|
11
|
+
require_relative 'runners/promote'
|
|
12
|
+
require_relative 'runners/retrieve'
|
|
13
|
+
|
|
14
|
+
module Legion
|
|
15
|
+
module Extensions
|
|
16
|
+
module Synapse
|
|
17
|
+
class Client
|
|
18
|
+
include Runners::Evaluate
|
|
19
|
+
include Runners::Pain
|
|
20
|
+
include Runners::Crystallize
|
|
21
|
+
include Runners::Mutate
|
|
22
|
+
include Runners::Revert
|
|
23
|
+
include Runners::Report
|
|
24
|
+
include Runners::GaiaReport
|
|
25
|
+
include Runners::Dream
|
|
26
|
+
include Runners::Promote
|
|
27
|
+
include Runners::Retrieve
|
|
28
|
+
|
|
29
|
+
attr_reader :conditioner_client, :transformer_client
|
|
30
|
+
|
|
31
|
+
def initialize(conditioner_client: nil, transformer_client: nil)
|
|
32
|
+
@conditioner_client = conditioner_client
|
|
33
|
+
@transformer_client = transformer_client
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def evaluate(synapse_id:, payload: {})
|
|
37
|
+
super(
|
|
38
|
+
synapse_id: synapse_id,
|
|
39
|
+
payload: payload,
|
|
40
|
+
conditioner_client: @conditioner_client,
|
|
41
|
+
transformer_client: @transformer_client
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def create(source_function_id:, target_function_id:, attention: nil, transform: nil,
|
|
46
|
+
routing_strategy: 'direct', origin: 'explicit', relationship_id: nil)
|
|
47
|
+
Data::Model::Synapse.create(
|
|
48
|
+
source_function_id: source_function_id,
|
|
49
|
+
target_function_id: target_function_id,
|
|
50
|
+
attention: attention,
|
|
51
|
+
transform: transform,
|
|
52
|
+
routing_strategy: routing_strategy,
|
|
53
|
+
origin: origin,
|
|
54
|
+
relationship_id: relationship_id,
|
|
55
|
+
confidence: Helpers::Confidence.starting_score(origin),
|
|
56
|
+
status: origin == 'emergent' ? 'observing' : 'active'
|
|
57
|
+
)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Sequel.migration do
|
|
4
|
+
up do
|
|
5
|
+
create_table(:synapses) do
|
|
6
|
+
primary_key :id
|
|
7
|
+
Integer :source_function_id, null: true, index: true
|
|
8
|
+
Integer :target_function_id, null: true, index: true
|
|
9
|
+
Integer :relationship_id, null: true, index: true
|
|
10
|
+
String :attention, text: true
|
|
11
|
+
String :transform, text: true
|
|
12
|
+
String :routing_strategy, null: false, default: 'direct', size: 50
|
|
13
|
+
Float :confidence, null: false, default: 0.5
|
|
14
|
+
Float :baseline_throughput, null: false, default: 0.0
|
|
15
|
+
String :origin, null: false, default: 'explicit', size: 50
|
|
16
|
+
String :status, null: false, default: 'active', size: 50
|
|
17
|
+
Integer :version, null: false, default: 1
|
|
18
|
+
DateTime :created_at, null: false, default: Sequel::CURRENT_TIMESTAMP
|
|
19
|
+
DateTime :updated_at
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
down do
|
|
24
|
+
drop_table :synapses
|
|
25
|
+
end
|
|
26
|
+
end
|