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.
- checksums.yaml +7 -0
- data/Gemfile +13 -0
- data/LICENSE +21 -0
- data/README.md +42 -0
- data/lex-cognitive-debt.gemspec +28 -0
- data/lib/legion/extensions/cognitive_debt/client.rb +24 -0
- data/lib/legion/extensions/cognitive_debt/helpers/constants.rb +32 -0
- data/lib/legion/extensions/cognitive_debt/helpers/debt_engine.rb +114 -0
- data/lib/legion/extensions/cognitive_debt/helpers/debt_item.rb +79 -0
- data/lib/legion/extensions/cognitive_debt/runners/cognitive_debt.rb +80 -0
- data/lib/legion/extensions/cognitive_debt/version.rb +9 -0
- data/lib/legion/extensions/cognitive_debt.rb +15 -0
- data/spec/legion/extensions/cognitive_debt/client_spec.rb +73 -0
- data/spec/legion/extensions/cognitive_debt/helpers/constants_spec.rb +78 -0
- data/spec/legion/extensions/cognitive_debt/helpers/debt_engine_spec.rb +297 -0
- data/spec/legion/extensions/cognitive_debt/helpers/debt_item_spec.rb +233 -0
- data/spec/legion/extensions/cognitive_debt/runners/cognitive_debt_spec.rb +196 -0
- data/spec/legion/extensions/cognitive_debt_spec.rb +15 -0
- data/spec/spec_helper.rb +23 -0
- metadata +65 -0
|
@@ -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
|
data/spec/spec_helper.rb
ADDED
|
@@ -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: []
|