Module: Legion::Extensions::Extinction::Runners::Extinction

Extended by:
Extinction
Included in:
Client, Extinction
Defined in:
lib/legion/extensions/extinction/runners/extinction.rb

Instance Method Summary collapse

Instance Method Details

#archive_agent(agent_id:, reason:, metadata: {}) ⇒ Object



66
67
68
69
70
# File 'lib/legion/extensions/extinction/runners/extinction.rb', line 66

def archive_agent(agent_id:, reason:, metadata: {}, **)
  record = archiver.archive(agent_id: agent_id, reason: reason, metadata: )
  record_audit(action: :archive, details: { agent_id: agent_id, reason: reason })
  { success: true, archive: record }
end

#deescalate(target_level:, authority:, reason:) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/legion/extensions/extinction/runners/extinction.rb', line 30

def deescalate(target_level:, authority:, reason:, **)
  result = protocol_state.deescalate(target_level: target_level, authority: authority, reason: reason)
  return result unless result[:success]

  emit_deescalation_event(target_level, authority, reason)
  record_audit(action:  :deescalate,
               details: { target_level: target_level, authority: authority, reason: reason })

  result
end

#escalate(level:, authority:, reason:) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/legion/extensions/extinction/runners/extinction.rb', line 15

def escalate(level:, authority:, reason:, **)
  result = protocol_state.escalate(level: level, authority: authority, reason: reason)
  return result unless result[:success]

  enforce_escalation_effects(level)
  emit_escalation_event(level, authority, reason)
  record_audit(action: :escalate, details: { level: level, authority: authority, reason: reason })

  if Legion::Extensions::Extinction::Settings.setting(:archive_on_escalate) && level >= 3
    archive_agent(agent_id: 'self', reason: "auto-archive at level #{level}", metadata: { triggered_by: :escalate })
  end

  result
end

#extinction_statusObject



41
42
43
44
45
# File 'lib/legion/extensions/extinction/runners/extinction.rb', line 41

def extinction_status(**)
  state = protocol_state.to_h
  level_info = Helpers::Levels.level_info(state[:current_level])
  { success: true, state: state, level_info: level_info }
end

#full_termination(agent_id:, authority:, reason:) ⇒ Object



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

def full_termination(agent_id:, authority:, reason:, **)
  gate = governance_check(authority: authority)
  return gate unless gate[:success]

  archive_result = archive_agent(agent_id: agent_id, reason: reason,
                                 metadata: { termination: true, authority: authority })
  return archive_result unless archive_result[:success]

  escalate_result = escalate(level: 4, authority: authority, reason: reason)
  return escalate_result unless escalate_result[:success]

  record_audit(action: :full_termination, details: { agent_id: agent_id, authority: authority, reason: reason })
  { success: true, agent_id: agent_id, archive: archive_result[:archive], terminated_at: Time.now.utc.iso8601 }
end

#monitor_protocolObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/legion/extensions/extinction/runners/extinction.rb', line 47

def monitor_protocol(**)
  state = protocol_state.to_h
  last_change = state[:last_change]
  stale       = false

  if last_change
    threshold_hours = Legion::Extensions::Extinction::Settings.setting(:stale_threshold_hours)
    changed_at      = Time.parse(last_change[:at]) rescue nil # rubocop:disable Style/RescueModifier
    stale           = changed_at && (Time.now.utc - changed_at) > (threshold_hours * 3600)
  end

  {
    success:    true,
    state:      state,
    stale:      stale,
    checked_at: Time.now.utc.iso8601
  }
end