lex-coldstart 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.
- checksums.yaml +7 -0
- data/Gemfile +8 -0
- data/lex-coldstart.gemspec +30 -0
- data/lib/legion/extensions/coldstart/actors/imprint.rb +33 -0
- data/lib/legion/extensions/coldstart/client.rb +23 -0
- data/lib/legion/extensions/coldstart/helpers/bootstrap.rb +102 -0
- data/lib/legion/extensions/coldstart/helpers/claude_parser.rb +231 -0
- data/lib/legion/extensions/coldstart/helpers/imprint.rb +48 -0
- data/lib/legion/extensions/coldstart/local_migrations/20260316000050_create_bootstrap_state.rb +13 -0
- data/lib/legion/extensions/coldstart/runners/coldstart.rb +65 -0
- data/lib/legion/extensions/coldstart/runners/ingest.rb +174 -0
- data/lib/legion/extensions/coldstart/version.rb +9 -0
- data/lib/legion/extensions/coldstart.rb +23 -0
- data/spec/fixtures/sample_claude.md +25 -0
- data/spec/fixtures/sample_memory.md +23 -0
- data/spec/legion/extensions/coldstart/actors/imprint_spec.rb +50 -0
- data/spec/legion/extensions/coldstart/client_spec.rb +14 -0
- data/spec/legion/extensions/coldstart/helpers/claude_parser_spec.rb +205 -0
- data/spec/legion/extensions/coldstart/runners/coldstart_spec.rb +66 -0
- data/spec/legion/extensions/coldstart/runners/ingest_spec.rb +77 -0
- data/spec/local_persistence_spec.rb +139 -0
- data/spec/spec_helper.rb +20 -0
- metadata +95 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'sequel'
|
|
5
|
+
require 'sequel/extensions/migration'
|
|
6
|
+
|
|
7
|
+
RSpec.describe 'lex-coldstart local persistence' do
|
|
8
|
+
let(:db) { Sequel.sqlite }
|
|
9
|
+
let(:migration_path) do
|
|
10
|
+
File.join(__dir__, '..', 'lib', 'legion', 'extensions', 'coldstart', 'local_migrations')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
Sequel::TimestampMigrator.new(db, migration_path).run
|
|
15
|
+
stub_const('Legion::Data::Local', local_mod)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:local_mod) do
|
|
19
|
+
db_ref = db
|
|
20
|
+
Module.new do
|
|
21
|
+
define_singleton_method(:connected?) { true }
|
|
22
|
+
define_singleton_method(:connection) { db_ref }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def fresh_bootstrap
|
|
27
|
+
Legion::Extensions::Coldstart::Helpers::Bootstrap.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe 'save and load round-trip' do
|
|
31
|
+
it 'persists firmware_loaded after load_firmware' do
|
|
32
|
+
b = fresh_bootstrap
|
|
33
|
+
b.load_firmware
|
|
34
|
+
b2 = fresh_bootstrap
|
|
35
|
+
expect(b2.firmware_loaded).to be true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'persists observation_count after record_observation calls' do
|
|
39
|
+
b = fresh_bootstrap
|
|
40
|
+
b.begin_imprint
|
|
41
|
+
3.times { b.record_observation }
|
|
42
|
+
b2 = fresh_bootstrap
|
|
43
|
+
expect(b2.observation_count).to eq(3)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'persists calibration_state as a symbol' do
|
|
47
|
+
b = fresh_bootstrap
|
|
48
|
+
b.begin_imprint
|
|
49
|
+
b2 = fresh_bootstrap
|
|
50
|
+
expect(b2.calibration_state).to eq(:imprinting)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe 'started_at preservation (imprint window survives restarts)' do
|
|
55
|
+
it 'restores started_at so the 7-day window continues from the original time' do
|
|
56
|
+
b = fresh_bootstrap
|
|
57
|
+
b.begin_imprint
|
|
58
|
+
original_started_at = b.started_at
|
|
59
|
+
|
|
60
|
+
b2 = fresh_bootstrap
|
|
61
|
+
expect(b2.started_at).not_to be_nil
|
|
62
|
+
expect(b2.started_at.to_i).to be_within(1).of(original_started_at.to_i)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'reports imprint still active after reload within the 7-day window' do
|
|
66
|
+
b = fresh_bootstrap
|
|
67
|
+
b.begin_imprint
|
|
68
|
+
b2 = fresh_bootstrap
|
|
69
|
+
expect(b2.imprint_active?).to be true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'does not reset started_at to nil on second boot' do
|
|
73
|
+
b = fresh_bootstrap
|
|
74
|
+
b.begin_imprint
|
|
75
|
+
b2 = fresh_bootstrap
|
|
76
|
+
expect(b2.started_at).not_to be_nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe 'calibration_state symbol round-trip' do
|
|
81
|
+
%i[not_started imprinting baseline_established calibrated].each do |state|
|
|
82
|
+
it "persists and restores :#{state}" do
|
|
83
|
+
fresh_bootstrap
|
|
84
|
+
# Force the state directly through the DB to test all symbol variants
|
|
85
|
+
db[:bootstrap_state].where(id: 1).delete
|
|
86
|
+
db[:bootstrap_state].insert(
|
|
87
|
+
id: 1,
|
|
88
|
+
started_at_i: nil,
|
|
89
|
+
observation_count: 0,
|
|
90
|
+
firmware_loaded: false,
|
|
91
|
+
calibration_state: state.to_s
|
|
92
|
+
)
|
|
93
|
+
b2 = fresh_bootstrap
|
|
94
|
+
expect(b2.calibration_state).to eq(state)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe 'graceful no-op when Local is not connected' do
|
|
100
|
+
before do
|
|
101
|
+
stub_const('Legion::Data::Local', disconnected_mod)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
let(:disconnected_mod) do
|
|
105
|
+
Module.new do
|
|
106
|
+
define_singleton_method(:connected?) { false }
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'does not raise on begin_imprint' do
|
|
111
|
+
expect { fresh_bootstrap.begin_imprint }.not_to raise_error
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'does not raise on load_firmware' do
|
|
115
|
+
expect { fresh_bootstrap.load_firmware }.not_to raise_error
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it 'does not raise on record_observation' do
|
|
119
|
+
b = fresh_bootstrap
|
|
120
|
+
b.begin_imprint
|
|
121
|
+
expect { b.record_observation }.not_to raise_error
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'leaves state at defaults when nothing is persisted' do
|
|
125
|
+
b = fresh_bootstrap
|
|
126
|
+
expect(b.started_at).to be_nil
|
|
127
|
+
expect(b.observation_count).to eq(0)
|
|
128
|
+
expect(b.firmware_loaded).to be false
|
|
129
|
+
expect(b.calibration_state).to eq(:not_started)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
describe 'graceful no-op when Legion::Data::Local is not defined' do
|
|
134
|
+
it 'does not raise on initialize when constant is absent' do
|
|
135
|
+
hide_const('Legion::Data::Local')
|
|
136
|
+
expect { fresh_bootstrap }.not_to raise_error
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
|
|
5
|
+
module Legion
|
|
6
|
+
module Logging
|
|
7
|
+
def self.debug(_msg); end
|
|
8
|
+
def self.info(_msg); end
|
|
9
|
+
def self.warn(_msg); end
|
|
10
|
+
def self.error(_msg); end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require 'legion/extensions/coldstart'
|
|
15
|
+
|
|
16
|
+
RSpec.configure do |config|
|
|
17
|
+
config.example_status_persistence_file_path = '.rspec_status'
|
|
18
|
+
config.disable_monkey_patching!
|
|
19
|
+
config.expect_with(:rspec) { |c| c.syntax = :expect }
|
|
20
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: lex-coldstart
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Esity
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: sequel
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '5.70'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '5.70'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: sqlite3
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.0'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.0'
|
|
40
|
+
description: Imprint window and bootstrap calibration for brain-modeled agentic AI
|
|
41
|
+
email:
|
|
42
|
+
- matthewdiverson@gmail.com
|
|
43
|
+
executables: []
|
|
44
|
+
extensions: []
|
|
45
|
+
extra_rdoc_files: []
|
|
46
|
+
files:
|
|
47
|
+
- Gemfile
|
|
48
|
+
- lex-coldstart.gemspec
|
|
49
|
+
- lib/legion/extensions/coldstart.rb
|
|
50
|
+
- lib/legion/extensions/coldstart/actors/imprint.rb
|
|
51
|
+
- lib/legion/extensions/coldstart/client.rb
|
|
52
|
+
- lib/legion/extensions/coldstart/helpers/bootstrap.rb
|
|
53
|
+
- lib/legion/extensions/coldstart/helpers/claude_parser.rb
|
|
54
|
+
- lib/legion/extensions/coldstart/helpers/imprint.rb
|
|
55
|
+
- lib/legion/extensions/coldstart/local_migrations/20260316000050_create_bootstrap_state.rb
|
|
56
|
+
- lib/legion/extensions/coldstart/runners/coldstart.rb
|
|
57
|
+
- lib/legion/extensions/coldstart/runners/ingest.rb
|
|
58
|
+
- lib/legion/extensions/coldstart/version.rb
|
|
59
|
+
- spec/fixtures/sample_claude.md
|
|
60
|
+
- spec/fixtures/sample_memory.md
|
|
61
|
+
- spec/legion/extensions/coldstart/actors/imprint_spec.rb
|
|
62
|
+
- spec/legion/extensions/coldstart/client_spec.rb
|
|
63
|
+
- spec/legion/extensions/coldstart/helpers/claude_parser_spec.rb
|
|
64
|
+
- spec/legion/extensions/coldstart/runners/coldstart_spec.rb
|
|
65
|
+
- spec/legion/extensions/coldstart/runners/ingest_spec.rb
|
|
66
|
+
- spec/local_persistence_spec.rb
|
|
67
|
+
- spec/spec_helper.rb
|
|
68
|
+
homepage: https://github.com/LegionIO/lex-coldstart
|
|
69
|
+
licenses:
|
|
70
|
+
- MIT
|
|
71
|
+
metadata:
|
|
72
|
+
homepage_uri: https://github.com/LegionIO/lex-coldstart
|
|
73
|
+
source_code_uri: https://github.com/LegionIO/lex-coldstart
|
|
74
|
+
documentation_uri: https://github.com/LegionIO/lex-coldstart
|
|
75
|
+
changelog_uri: https://github.com/LegionIO/lex-coldstart
|
|
76
|
+
bug_tracker_uri: https://github.com/LegionIO/lex-coldstart/issues
|
|
77
|
+
rubygems_mfa_required: 'true'
|
|
78
|
+
rdoc_options: []
|
|
79
|
+
require_paths:
|
|
80
|
+
- lib
|
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '3.4'
|
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
requirements: []
|
|
92
|
+
rubygems_version: 3.6.9
|
|
93
|
+
specification_version: 4
|
|
94
|
+
summary: LEX Coldstart
|
|
95
|
+
test_files: []
|