lex-cognitive-debt 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.
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/cognitive_debt/client'
4
+
5
+ RSpec.describe Legion::Extensions::CognitiveDebt::Runners::CognitiveDebt do
6
+ let(:engine) { Legion::Extensions::CognitiveDebt::Helpers::DebtEngine.new }
7
+ let(:client) { Legion::Extensions::CognitiveDebt::Client.new(engine: engine) }
8
+
9
+ describe '#create_debt' do
10
+ it 'creates a debt via the engine' do
11
+ result = client.create_debt(label: 'decide on auth', debt_type: :deferred_decision)
12
+ expect(result[:created]).to be true
13
+ end
14
+
15
+ it 'returns a debt_id' do
16
+ result = client.create_debt(label: 'decide on auth', debt_type: :deferred_decision)
17
+ expect(result[:debt_id]).not_to be_nil
18
+ end
19
+
20
+ it 'passes custom principal' do
21
+ result = client.create_debt(label: 'x', debt_type: :unprocessed_input, principal: 0.7)
22
+ expect(result[:debt][:principal]).to eq(0.7)
23
+ end
24
+
25
+ it 'passes custom domain' do
26
+ result = client.create_debt(label: 'x', debt_type: :incomplete_analysis, domain: 'security')
27
+ expect(result[:debt][:domain]).to eq('security')
28
+ end
29
+
30
+ it 'uses default principal when not specified' do
31
+ result = client.create_debt(label: 'x', debt_type: :deferred_decision)
32
+ expected = Legion::Extensions::CognitiveDebt::Helpers::Constants::DEFAULT_PRINCIPAL
33
+ expect(result[:debt][:principal]).to eq(expected)
34
+ end
35
+
36
+ it 'returns created: false for invalid type' do
37
+ result = client.create_debt(label: 'x', debt_type: :nonexistent)
38
+ expect(result[:created]).to be false
39
+ end
40
+ end
41
+
42
+ describe '#repay_debt' do
43
+ let!(:debt_id) do
44
+ client.create_debt(label: 'unresolved thing', debt_type: :unresolved_conflict)[:debt_id]
45
+ end
46
+
47
+ it 'repays an existing debt' do
48
+ result = client.repay_debt(debt_id: debt_id)
49
+ expect(result[:repaid]).to be true
50
+ end
51
+
52
+ it 'returns found: false for unknown id' do
53
+ result = client.repay_debt(debt_id: 'no-such-id')
54
+ expect(result[:found]).to be false
55
+ end
56
+
57
+ it 'uses custom amount' do
58
+ result = client.repay_debt(debt_id: debt_id, amount: 0.05)
59
+ expect(result[:found]).to be true
60
+ end
61
+ end
62
+
63
+ describe '#accrue_interest' do
64
+ before { client.create_debt(label: 'pending work', debt_type: :pending_integration, principal: 0.4) }
65
+
66
+ it 'accrues interest on active debts' do
67
+ result = client.accrue_interest
68
+ expect(result[:accrued]).to eq(1)
69
+ end
70
+
71
+ it 'returns total_debt' do
72
+ result = client.accrue_interest
73
+ expect(result[:total_debt]).to be > 0.4
74
+ end
75
+ end
76
+
77
+ describe '#total_debt' do
78
+ it 'returns 0 for empty engine' do
79
+ result = client.total_debt
80
+ expect(result[:total_debt]).to eq(0.0)
81
+ end
82
+
83
+ it 'reflects created debts' do
84
+ client.create_debt(label: 'x', debt_type: :deferred_decision, principal: 0.5)
85
+ result = client.total_debt
86
+ expect(result[:total_debt]).to be_within(1e-10).of(0.5)
87
+ end
88
+ end
89
+
90
+ describe '#debt_by_type' do
91
+ before do
92
+ client.create_debt(label: 'a', debt_type: :deferred_decision)
93
+ client.create_debt(label: 'b', debt_type: :deferred_decision)
94
+ client.create_debt(label: 'c', debt_type: :unprocessed_input)
95
+ end
96
+
97
+ it 'returns count for the specified type' do
98
+ result = client.debt_by_type(debt_type: :deferred_decision)
99
+ expect(result[:count]).to eq(2)
100
+ end
101
+
102
+ it 'returns 0 for type with no debts' do
103
+ result = client.debt_by_type(debt_type: :unresolved_conflict)
104
+ expect(result[:count]).to eq(0)
105
+ end
106
+ end
107
+
108
+ describe '#debt_by_domain' do
109
+ before do
110
+ client.create_debt(label: 'a', debt_type: :deferred_decision, domain: 'perf')
111
+ client.create_debt(label: 'b', debt_type: :unprocessed_input, domain: 'perf')
112
+ end
113
+
114
+ it 'returns count for the specified domain' do
115
+ result = client.debt_by_domain(domain: 'perf')
116
+ expect(result[:count]).to eq(2)
117
+ end
118
+
119
+ it 'returns 0 for unknown domain' do
120
+ result = client.debt_by_domain(domain: 'unknown')
121
+ expect(result[:count]).to eq(0)
122
+ end
123
+ end
124
+
125
+ describe '#most_costly' do
126
+ before do
127
+ client.create_debt(label: 'cheap', debt_type: :deferred_decision, principal: 0.1)
128
+ client.create_debt(label: 'expensive', debt_type: :deferred_decision, principal: 0.9)
129
+ end
130
+
131
+ it 'returns most costly first' do
132
+ result = client.most_costly(limit: 2)
133
+ expect(result[:items].first[:principal]).to eq(0.9)
134
+ end
135
+
136
+ it 'respects the limit' do
137
+ result = client.most_costly(limit: 1)
138
+ expect(result[:count]).to eq(1)
139
+ end
140
+ end
141
+
142
+ describe '#oldest_debts' do
143
+ it 'returns debts ordered by age' do
144
+ client.create_debt(label: 'old', debt_type: :deferred_decision)
145
+ sleep(0.01)
146
+ client.create_debt(label: 'newer', debt_type: :deferred_decision)
147
+ result = client.oldest_debts(limit: 2)
148
+ expect(result[:items].first[:label]).to eq('old')
149
+ end
150
+ end
151
+
152
+ describe '#debt_report' do
153
+ before do
154
+ client.create_debt(label: 'decision', debt_type: :deferred_decision, principal: 0.3)
155
+ client.create_debt(label: 'analysis', debt_type: :incomplete_analysis, principal: 0.6)
156
+ end
157
+
158
+ it 'includes total_debt' do
159
+ report = client.debt_report
160
+ expect(report[:total_debt]).to be > 0.0
161
+ end
162
+
163
+ it 'includes active_count' do
164
+ report = client.debt_report
165
+ expect(report[:active_count]).to eq(2)
166
+ end
167
+
168
+ it 'includes by_type with all five types' do
169
+ report = client.debt_report
170
+ expect(report[:by_type].keys).to match_array(
171
+ Legion::Extensions::CognitiveDebt::Helpers::Constants::DEBT_TYPES
172
+ )
173
+ end
174
+
175
+ it 'includes recommended_priority' do
176
+ report = client.debt_report
177
+ expect(report[:recommended_priority]).not_to be_empty
178
+ end
179
+ end
180
+
181
+ describe '#prune_repaid' do
182
+ it 'prunes repaid debts and returns counts' do
183
+ id = client.create_debt(label: 'done', debt_type: :deferred_decision)[:debt_id]
184
+ client.repay_debt(debt_id: id, amount: 99.0)
185
+ result = client.prune_repaid
186
+ expect(result[:pruned]).to eq(1)
187
+ expect(result[:remaining]).to eq(0)
188
+ end
189
+
190
+ it 'returns pruned: 0 when nothing to prune' do
191
+ client.create_debt(label: 'active', debt_type: :deferred_decision)
192
+ result = client.prune_repaid
193
+ expect(result[:pruned]).to eq(0)
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::CognitiveDebt do
4
+ it 'has a version number' do
5
+ expect(Legion::Extensions::CognitiveDebt::VERSION).not_to be_nil
6
+ end
7
+
8
+ it 'has a version that is a string' do
9
+ expect(Legion::Extensions::CognitiveDebt::VERSION).to be_a(String)
10
+ end
11
+
12
+ it 'has the correct version format' do
13
+ expect(Legion::Extensions::CognitiveDebt::VERSION).to match(/\A\d+\.\d+\.\d+\z/)
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ module Legion
6
+ module Logging
7
+ def self.debug(_msg); end
8
+
9
+ def self.info(_msg); end
10
+
11
+ def self.warn(_msg); end
12
+
13
+ def self.error(_msg); end
14
+ end
15
+ end
16
+
17
+ require 'legion/extensions/cognitive_debt'
18
+
19
+ RSpec.configure do |config|
20
+ config.example_status_persistence_file_path = '.rspec_status'
21
+ config.disable_monkey_patching!
22
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
23
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-cognitive-debt
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
+ description: Cognitive debt modeling for brain-modeled agentic AI — deferred processing
13
+ that accrues interest over time
14
+ email:
15
+ - matthewdiverson@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - Gemfile
21
+ - LICENSE
22
+ - README.md
23
+ - lex-cognitive-debt.gemspec
24
+ - lib/legion/extensions/cognitive_debt.rb
25
+ - lib/legion/extensions/cognitive_debt/client.rb
26
+ - lib/legion/extensions/cognitive_debt/helpers/constants.rb
27
+ - lib/legion/extensions/cognitive_debt/helpers/debt_engine.rb
28
+ - lib/legion/extensions/cognitive_debt/helpers/debt_item.rb
29
+ - lib/legion/extensions/cognitive_debt/runners/cognitive_debt.rb
30
+ - lib/legion/extensions/cognitive_debt/version.rb
31
+ - spec/legion/extensions/cognitive_debt/client_spec.rb
32
+ - spec/legion/extensions/cognitive_debt/helpers/constants_spec.rb
33
+ - spec/legion/extensions/cognitive_debt/helpers/debt_engine_spec.rb
34
+ - spec/legion/extensions/cognitive_debt/helpers/debt_item_spec.rb
35
+ - spec/legion/extensions/cognitive_debt/runners/cognitive_debt_spec.rb
36
+ - spec/legion/extensions/cognitive_debt_spec.rb
37
+ - spec/spec_helper.rb
38
+ homepage: https://github.com/LegionIO/lex-cognitive-debt
39
+ licenses:
40
+ - MIT
41
+ metadata:
42
+ homepage_uri: https://github.com/LegionIO/lex-cognitive-debt
43
+ source_code_uri: https://github.com/LegionIO/lex-cognitive-debt
44
+ documentation_uri: https://github.com/LegionIO/lex-cognitive-debt
45
+ changelog_uri: https://github.com/LegionIO/lex-cognitive-debt
46
+ bug_tracker_uri: https://github.com/LegionIO/lex-cognitive-debt/issues
47
+ rubygems_mfa_required: 'true'
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '3.4'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubygems_version: 3.6.9
63
+ specification_version: 4
64
+ summary: LEX Cognitive Debt
65
+ test_files: []