Class: Legion::Extensions::Agentic::Executive::DissonanceResolution::Helpers::ResolutionEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb

Constant Summary

Constants included from Constants

Constants::DEFAULT_TENSION, Constants::MAX_CONFLICTS, Constants::MAX_STRATEGIES, Constants::OUTCOME_LABELS, Constants::RESOLUTION_THRESHOLD, Constants::STRATEGIES, Constants::TENSION_DECAY, Constants::TENSION_LABELS

Instance Method Summary collapse

Constructor Details

#initializeResolutionEngine

Returns a new instance of ResolutionEngine.



12
13
14
15
16
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 12

def initialize
  @conflicts         = {}
  @strategy_history  = Hash.new(0)
  @strategy_successes = Hash.new(0)
end

Instance Method Details

#abandon_conflict(conflict_id:) ⇒ Object



50
51
52
53
54
55
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 50

def abandon_conflict(conflict_id:)
  conflict = @conflicts[conflict_id]
  return nil unless conflict

  conflict.abandon!
end

#apply_strategy(conflict_id:, strategy:, effectiveness: 0.3) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 30

def apply_strategy(conflict_id:, strategy:, effectiveness: 0.3)
  conflict = @conflicts[conflict_id]
  return nil unless conflict

  strat = strategy.to_sym
  return nil unless STRATEGIES.include?(strat)

  @strategy_history[strat] += 1
  conflict.apply_strategy!(strategy: strat, effectiveness: effectiveness)
  @strategy_successes[strat] += 1 if conflict.resolved?
  conflict
end

#average_tensionObject



109
110
111
112
113
114
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 109

def average_tension
  return 0.0 if @conflicts.empty?

  tensions = @conflicts.values.map(&:tension)
  (tensions.sum / tensions.size).round(10)
end

#best_strategyObject



62
63
64
65
66
67
68
69
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 62

def best_strategy
  return nil if @strategy_history.empty?

  @strategy_history.max_by do |strat, uses|
    rate = uses.positive? ? @strategy_successes[strat].to_f / uses : 0.0
    rate
  end&.first
end

#conflicts_by_domain(domain:) ⇒ Object



92
93
94
95
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 92

def conflicts_by_domain(domain:)
  d = domain.to_sym
  @conflicts.values.select { |c| c.domain == d }
end

#create_conflict(belief_a:, belief_b:, domain: :general, tension: DEFAULT_TENSION) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 18

def create_conflict(belief_a:, belief_b:, domain: :general, tension: DEFAULT_TENSION)
  prune_if_needed
  conflict = DissonanceConflict.new(
    belief_a: belief_a,
    belief_b: belief_b,
    domain:   domain,
    tension:  tension
  )
  @conflicts[conflict.id] = conflict
  conflict
end

#decay_allObject



57
58
59
60
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 57

def decay_all
  @conflicts.each_value(&:decay!)
  @conflicts.size
end

#dissonance_reportObject



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 116

def dissonance_report
  {
    total_conflicts: @conflicts.size,
    ongoing:         ongoing_conflicts.size,
    resolved:        resolved_conflicts.size,
    resolution_rate: resolution_rate,
    average_tension: average_tension,
    best_strategy:   best_strategy,
    most_tense:      most_tense(limit: 3).map(&:to_h)
  }
end

#escalate_conflict(conflict_id:, amount: 0.15) ⇒ Object



43
44
45
46
47
48
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 43

def escalate_conflict(conflict_id:, amount: 0.15)
  conflict = @conflicts[conflict_id]
  return nil unless conflict

  conflict.escalate!(amount: amount)
end

#most_tense(limit: 5) ⇒ Object



97
98
99
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 97

def most_tense(limit: 5)
  @conflicts.values.sort_by { |c| -c.tension }.first(limit)
end

#ongoing_conflictsObject



84
85
86
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 84

def ongoing_conflicts
  @conflicts.values.select { |c| c.outcome == :ongoing }
end

#resolution_rateObject



101
102
103
104
105
106
107
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 101

def resolution_rate
  total = @conflicts.size
  return 0.0 if total.zero?

  resolved = resolved_conflicts.size
  (resolved.to_f / total).round(4)
end

#resolved_conflictsObject



88
89
90
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 88

def resolved_conflicts
  @conflicts.values.select { |c| c.outcome == :resolved }
end

#strategy_reportObject



71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 71

def strategy_report
  STRATEGIES.map do |strat|
    uses = @strategy_history[strat]
    successes = @strategy_successes[strat]
    {
      strategy:     strat,
      uses:         uses,
      successes:    successes,
      success_rate: uses.positive? ? (successes.to_f / uses).round(4) : 0.0
    }
  end
end

#to_hObject



128
129
130
131
132
133
134
135
136
# File 'lib/legion/extensions/agentic/executive/dissonance_resolution/helpers/resolution_engine.rb', line 128

def to_h
  {
    total_conflicts: @conflicts.size,
    ongoing:         ongoing_conflicts.size,
    resolved:        resolved_conflicts.size,
    resolution_rate: resolution_rate,
    average_tension: average_tension
  }
end