lex-agentic-imagination 0.1.3 → 0.1.5

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: 3af7d0d34493b7ea8b8d0fa72ac77bf3fbd4bad997c082f3f18a6ec061b1c9b8
4
- data.tar.gz: c951351daa2a467697fcf162bced6dc603c8e5730230eed56ab1ee8e0e0a1bd9
3
+ metadata.gz: 6f5191865c4db37b876514b940c7ac084ff298416edb3e562c393847251fc9b4
4
+ data.tar.gz: 2ba1d6fda45304a1e71b5cdbccf0eaee008c99f109ea59eacf86f472330cf1f2
5
5
  SHA512:
6
- metadata.gz: 02a8b50a581717b1a59aa587a3326739bc8736d70accce42ce142714f09f6b24d4d20604a3b735af26967568579ab3e96abb840a65f92cfb7ddc90ae701affff
7
- data.tar.gz: ce6b5146992776ffdf6c8c7af4f3db4a19c368b10ed7eda0299ad8a1bc7c5e9282d4f2c18cd4492071c055026922cce2bad7b0ae7a9beee1a730335382e28118
6
+ metadata.gz: 4c498861d224fc8f74d6f867c9d581871fd7f7a8d3e8325a7c1d1a2ba66d90d8f2a2a9798d3c7baff15aeb12d84f53fe3b51f11d2bf2d862c8929188050ddeb2
7
+ data.tar.gz: 03b4a4cfa47bb540f80e624c7ce42bd2af6a383225dc89e9f2ce1d525ac55d82e204766d0ba00829164f074618cf89f0c41dad5886ce1cc03c6e950f04997f0b
data/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.1.5] - 2026-03-23
4
+
5
+ ### Added
6
+ - Dream cycle knowledge promotion phase: promotes high-novelty association discoveries and resolved contradictions to Apollo knowledge graph
7
+ - `phase_knowledge_promotion` ingests novel walks (novelty > 0.8) as associations and resolved contradictions as facts
8
+ - Dream journal now includes Phase 7: Knowledge Promotion section with promotion count
9
+ - Soft guard: phase is a no-op when lex-apollo or legion-data are not loaded
10
+
11
+ ## [0.1.4] - 2026-03-22
12
+
13
+ ### Changed
14
+ - Add 7 legion-* runtime dependencies to gemspec (legion-cache, legion-crypt, legion-data, legion-json, legion-logging, legion-settings, legion-transport)
15
+ - Update spec_helper to use real sub-gem helpers with Helpers::Lex including all 7 helper modules
4
16
 
5
17
  ## [0.1.3] - 2026-03-21
6
18
 
data/README.md CHANGED
@@ -5,7 +5,7 @@ Domain consolidation gem for imagination, creativity, and offline simulation. Bu
5
5
  ## Overview
6
6
 
7
7
  **Gem**: `lex-agentic-imagination`
8
- **Version**: 0.1.2
8
+ **Version**: 0.1.0
9
9
  **Namespace**: `Legion::Extensions::Agentic::Imagination`
10
10
 
11
11
  ## Sub-Modules
@@ -45,7 +45,7 @@ gem 'lex-agentic-imagination'
45
45
 
46
46
  ```bash
47
47
  bundle install
48
- bundle exec rspec # 1855 examples, 0 failures
48
+ bundle exec rspec # 1885 examples, 0 failures
49
49
  bundle exec rubocop # 0 offenses
50
50
  ```
51
51
 
@@ -24,6 +24,14 @@ Gem::Specification.new do |spec|
24
24
  end
25
25
  spec.require_paths = ['lib']
26
26
 
27
+ spec.add_dependency 'legion-cache', '>= 1.3.11'
28
+ spec.add_dependency 'legion-crypt', '>= 1.4.9'
29
+ spec.add_dependency 'legion-data', '>= 1.4.17'
30
+ spec.add_dependency 'legion-json', '>= 1.2.1'
31
+ spec.add_dependency 'legion-logging', '>= 1.3.2'
32
+ spec.add_dependency 'legion-settings', '>= 1.3.14'
33
+ spec.add_dependency 'legion-transport', '>= 1.3.9'
34
+
27
35
  spec.add_development_dependency 'lex-emotion'
28
36
  spec.add_development_dependency 'lex-identity'
29
37
  spec.add_development_dependency 'lex-memory'
@@ -22,6 +22,7 @@ module Legion
22
22
  identity_entropy_check
23
23
  agenda_formation
24
24
  consolidation_commit
25
+ knowledge_promotion
25
26
  dream_reflection
26
27
  dream_narration
27
28
  ].freeze
@@ -38,6 +38,7 @@ module Legion
38
38
  section_identity_entropy(lines, results, phase_data)
39
39
  section_agenda(lines, results, phase_data)
40
40
  section_consolidation(lines, results)
41
+ section_knowledge_promotion(lines, results)
41
42
  section_summary(lines, results, phase_data)
42
43
  lines.join("\n")
43
44
  end
@@ -160,6 +161,18 @@ module Legion
160
161
  lines << ''
161
162
  end
162
163
 
164
+ def section_knowledge_promotion(lines, results)
165
+ promo = results[:knowledge_promotion] || {}
166
+ lines << '## Phase 7: Knowledge Promotion'
167
+ lines << ''
168
+ lines << if promo[:status] == :skipped
169
+ "- Skipped: #{promo[:reason]}"
170
+ else
171
+ "- Insights promoted to Apollo: #{promo[:promoted]}"
172
+ end
173
+ lines << ''
174
+ end
175
+
163
176
  def section_summary(lines, results, phase_data)
164
177
  audit = results[:memory_audit] || {}
165
178
  contra = results[:contradiction_resolution] || {}
@@ -179,6 +192,7 @@ module Legion
179
192
  lines << "| Contradictions resolved | #{resolved} |"
180
193
  lines << "| Agenda items formed | #{(results[:agenda_formation] || {})[:agenda_items]} |"
181
194
  lines << "| Traces consolidated | #{(results[:consolidation_commit] || {})[:traces_written]} |"
195
+ lines << "| Knowledge promoted | #{(results[:knowledge_promotion] || {})[:promoted]} |"
182
196
  end
183
197
 
184
198
  def format_resolutions(lines, resolutions)
@@ -220,8 +234,9 @@ module Legion
220
234
 
221
235
  private_class_method :section_narrative, :section_memory_audit, :section_association_walk,
222
236
  :section_contradiction_resolution, :section_identity_entropy,
223
- :section_agenda, :section_consolidation, :section_summary,
224
- :format_resolutions, :extract_payload, :truncate, :summarize_content
237
+ :section_agenda, :section_consolidation, :section_knowledge_promotion,
238
+ :section_summary, :format_resolutions, :extract_payload,
239
+ :truncate, :summarize_content
225
240
  end
226
241
  end
227
242
  end
@@ -267,6 +267,19 @@ module Legion
267
267
  { traces_written: traces.size, dream_store_cleared: true }
268
268
  end
269
269
 
270
+ def phase_knowledge_promotion(**)
271
+ return { status: :skipped, reason: :apollo_unavailable } unless apollo_available?
272
+
273
+ runner = Object.new.extend(Legion::Extensions::Apollo::Runners::Knowledge)
274
+ promoted = promote_novel_associations(runner) + promote_resolved_contradictions(runner)
275
+
276
+ Legion::Logging.debug "[dream] knowledge_promotion: promoted=#{promoted}"
277
+ { promoted: promoted }
278
+ rescue StandardError => e
279
+ Legion::Logging.warn "[dream] knowledge_promotion failed: #{e.message}"
280
+ { status: :error, error: e.message }
281
+ end
282
+
270
283
  def phase_dream_reflection(**)
271
284
  return { status: :skipped, reason: :extension_not_loaded } unless reflection_available?
272
285
 
@@ -316,6 +329,67 @@ module Legion
316
329
  false
317
330
  end
318
331
 
332
+ def promote_novel_associations(knowledge_runner)
333
+ walk_results = @phase_data[:walk_results] || []
334
+ store = memory.send(:default_store)
335
+ count = 0
336
+
337
+ walk_results.select { |w| w[:novelty_score] && w[:novelty_score] > 0.8 }.each do |walk|
338
+ path_traces = walk[:path]&.filter_map { |id| store.get(id) }
339
+ next if path_traces.size < 2
340
+
341
+ payloads = path_traces.map { |t| summarize_trace_payload(t) }.compact
342
+ next if payloads.empty?
343
+
344
+ knowledge_runner.handle_ingest(
345
+ content: "Novel association discovered: #{payloads.join(' -> ')}",
346
+ content_type: :association,
347
+ tags: ['dream_cycle', 'association_walk', "novelty:#{walk[:novelty_score].round(2)}"],
348
+ source_agent: 'dream-cycle',
349
+ source_provider: 'legion',
350
+ source_channel: 'dream_association_walk',
351
+ context: { path_length: walk[:path]&.size, novelty: walk[:novelty_score] }
352
+ )
353
+ count += 1
354
+ end
355
+ count
356
+ end
357
+
358
+ def promote_resolved_contradictions(knowledge_runner)
359
+ contradictions = @phase_data[:contradictions] || []
360
+ count = 0
361
+
362
+ contradictions.select { |c| c[:resolution] == :resolved && c[:reasoning] }.each do |contra|
363
+ knowledge_runner.handle_ingest(
364
+ content: "Contradiction resolved: #{contra[:reasoning][0, 500]}",
365
+ content_type: :fact,
366
+ tags: ['dream_cycle', 'contradiction_resolved', "domain:#{contra[:domain]}"],
367
+ source_agent: 'dream-cycle',
368
+ source_provider: 'legion',
369
+ source_channel: 'dream_contradiction',
370
+ context: { domain: contra[:domain], winner_id: contra[:winner_id] }
371
+ )
372
+ count += 1
373
+ end
374
+ count
375
+ end
376
+
377
+ def apollo_available?
378
+ defined?(Legion::Extensions::Apollo::Runners::Knowledge) &&
379
+ defined?(Legion::Data::Model::ApolloEntry)
380
+ rescue StandardError
381
+ false
382
+ end
383
+
384
+ def summarize_trace_payload(trace)
385
+ payload = trace[:content_payload]
386
+ case payload
387
+ when String then payload[0, 120]
388
+ when Hash then payload.values.first(3).map { |v| v.to_s[0, 40] }.join(', ')
389
+ else payload.to_s[0, 120]
390
+ end
391
+ end
392
+
319
393
  def dream_store
320
394
  @dream_store ||= Helpers::DreamStore.new
321
395
  end
@@ -5,7 +5,7 @@ module Legion
5
5
  module Agentic
6
6
  module Imagination
7
7
  module Dream
8
- VERSION = '0.1.1'
8
+ VERSION = '0.1.2'
9
9
  end
10
10
  end
11
11
  end
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Agentic
6
6
  module Imagination
7
- VERSION = '0.1.3'
7
+ VERSION = '0.1.5'
8
8
  end
9
9
  end
10
10
  end
@@ -15,12 +15,12 @@ RSpec.describe Legion::Extensions::Agentic::Imagination::Dream::Runners::DreamCy
15
15
  let(:trace_helper) { Legion::Extensions::Memory::Helpers::Trace }
16
16
 
17
17
  describe '#execute_dream_cycle' do
18
- it 'returns a result hash with all eight phases' do
18
+ it 'returns a result hash with all nine phases' do
19
19
  result = client.execute_dream_cycle
20
20
  expect(result[:phases].keys).to contain_exactly(
21
21
  :memory_audit, :association_walk, :contradiction_resolution,
22
22
  :identity_entropy_check, :agenda_formation, :consolidation_commit,
23
- :dream_reflection, :dream_narration
23
+ :knowledge_promotion, :dream_reflection, :dream_narration
24
24
  )
25
25
  end
26
26
 
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/setup'
4
+ require 'legion/logging'
5
+ require 'legion/settings'
6
+ require 'legion/cache/helper'
7
+ require 'legion/crypt/helper'
8
+ require 'legion/data/helper'
9
+ require 'legion/json/helper'
10
+ require 'legion/transport/helper'
4
11
 
5
12
  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
- def self.fatal(_msg); end
12
- end
13
-
14
13
  module Extensions
15
14
  module Core
16
15
  def self.extended(_base); end
@@ -18,24 +17,30 @@ module Legion
18
17
 
19
18
  module Helpers
20
19
  module Lex
21
- def self.included(_base); end
20
+ include Legion::Logging::Helper
21
+ include Legion::Settings::Helper
22
+ include Legion::Cache::Helper
23
+ include Legion::Crypt::Helper
24
+ include Legion::Data::Helper
25
+ include Legion::JSON::Helper
26
+ include Legion::Transport::Helper
22
27
  end
23
28
  end
24
- end
25
- end
26
29
 
27
- # rubocop:disable Lint/EmptyClass, Style/OneClassPerFile
28
- module Legion
29
- module Extensions
30
30
  module Actors
31
- class Every; end
32
- class Once; end
31
+ class Every
32
+ include Helpers::Lex
33
+ end
34
+
35
+ class Once
36
+ include Helpers::Lex
37
+ end
33
38
  end
34
39
  end
35
40
  end
41
+
36
42
  $LOADED_FEATURES << 'legion/extensions/actors/every'
37
43
  $LOADED_FEATURES << 'legion/extensions/actors/once'
38
- # rubocop:enable Lint/EmptyClass, Style/OneClassPerFile
39
44
 
40
45
  require 'legion/extensions/memory'
41
46
  require 'legion/extensions/memory/client'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-agentic-imagination
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -9,6 +9,104 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: legion-cache
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 1.3.11
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 1.3.11
26
+ - !ruby/object:Gem::Dependency
27
+ name: legion-crypt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.9
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.4.9
40
+ - !ruby/object:Gem::Dependency
41
+ name: legion-data
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.4.17
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.4.17
54
+ - !ruby/object:Gem::Dependency
55
+ name: legion-json
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.2.1
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.2.1
68
+ - !ruby/object:Gem::Dependency
69
+ name: legion-logging
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.2
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 1.3.2
82
+ - !ruby/object:Gem::Dependency
83
+ name: legion-settings
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.3.14
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 1.3.14
96
+ - !ruby/object:Gem::Dependency
97
+ name: legion-transport
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.3.9
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.9
12
110
  - !ruby/object:Gem::Dependency
13
111
  name: lex-emotion
14
112
  requirement: !ruby/object:Gem::Requirement