Module: Legion::Extensions::Agentic::Affect::Resilience::Runners::Resilience

Includes:
Helpers::Lex
Included in:
Client
Defined in:
lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb

Instance Method Summary collapse

Instance Method Details

#adversity_reportObject



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 52

def adversity_report(**)
  log.debug('[resilience] adversity report')

  {
    active:    adversity_tracker.active_adversities,
    by_type:   adversity_tracker.active_by_type,
    total:     adversity_tracker.total_adversities,
    worst:     adversity_tracker.worst_health.round(4),
    avg_speed: adversity_tracker.average_recovery_speed.round(4)
  }
end

#dimension_detail(dimension:) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 64

def dimension_detail(dimension:, **)
  detail = resilience_model.dimension_detail(dimension.to_sym)
  return { error: "unknown dimension: #{dimension}" } unless detail

  log.debug("[resilience] dimension #{dimension}: #{detail[:value]}")
  detail
end

#register_adversity(type:, severity:, context: {}) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 32

def register_adversity(type:, severity:, context: {}, **)
  adversity = adversity_tracker.register(type: type, severity: severity, context: context)
  return { success: false, error: 'invalid type or severity' } unless adversity

  log.info("[resilience] adversity registered: type=#{type} severity=#{severity}")
  { success: true, adversity: adversity }
end

#resilience_statsObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 72

def resilience_stats(**)
  log.debug('[resilience] stats')

  {
    composite:              resilience_model.composite_score.round(4),
    classification:         resilience_model.classification,
    dimensions:             resilience_model.dimensions.transform_values { |v| v.round(4) },
    growth_bonus:           resilience_model.growth_bonus.round(4),
    trend:                  resilience_model.trend,
    total_adversities:      adversity_tracker.total_adversities,
    active_adversities:     adversity_tracker.active_adversities.size,
    recovery_rate:          adversity_tracker.recovery_rate.round(4),
    consecutive_recoveries: adversity_tracker.consecutive_recoveries,
    history_size:           resilience_model.history.size
  }
end

#resilience_statusObject



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 40

def resilience_status(**)
  model_state = resilience_model.to_h
  log.debug("[resilience] status: #{model_state[:class]} score=#{model_state[:composite]}")

  model_state.merge(
    active_adversities:     adversity_tracker.active_adversities.size,
    total_adversities:      adversity_tracker.total_adversities,
    consecutive_recoveries: adversity_tracker.consecutive_recoveries,
    recovery_rate:          adversity_tracker.recovery_rate.round(4)
  )
end

#update_resilience(tick_results: {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/legion/extensions/agentic/affect/resilience/runners/resilience.rb', line 13

def update_resilience(tick_results: {}, **)
  detect_adversities(tick_results)
  recovery = adversity_tracker.tick_recovery
  resilience_model.update_from_tracker(adversity_tracker)

  log.debug("[resilience] active=#{recovery[:active_count]} " \
            "resolved=#{recovery[:resolved_count]} " \
            "composite=#{resilience_model.composite_score.round(3)}")

  {
    active_adversities: recovery[:active_count],
    resolved_this_tick: recovery[:resolved_count],
    worst_health:       recovery[:worst_health],
    composite_score:    resilience_model.composite_score.round(4),
    classification:     resilience_model.classification,
    growth_bonus:       resilience_model.growth_bonus.round(4)
  }
end