Module: Legion::Extensions::Agentic::Social::Governance::Runners::Governance

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

Instance Method Summary collapse

Instance Method Details

#create_proposal(category:, description:, proposer:, council_size: nil) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 13

def create_proposal(category:, description:, proposer:, council_size: nil, **)
  return { error: :invalid_category, valid: Helpers::Layers::PROPOSAL_CATEGORIES } unless Helpers::Layers.valid_category?(category)

  size = council_size || Helpers::Layers::MIN_COUNCIL_SIZE
  id = proposal_store.create(category: category, description: description,
                             proposer: proposer, council_size: size)
  log.info "[governance] proposal created: id=#{id[0..7]} category=#{category} proposer=#{proposer} council=#{size}"
  { proposal_id: id, category: category, status: :open }
end

#get_proposal(proposal_id:) ⇒ Object



38
39
40
41
42
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 38

def get_proposal(proposal_id:, **)
  prop = proposal_store.get(proposal_id)
  log.debug "[governance] get: proposal=#{proposal_id[0..7]} found=#{!prop.nil?}"
  prop ? { found: true, proposal: prop } : { found: false }
end

#open_proposalsObject



44
45
46
47
48
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 44

def open_proposals(**)
  props = proposal_store.open_proposals
  log.debug "[governance] open proposals: count=#{props.size}"
  { proposals: props, count: props.size }
end

#timeout_proposalsObject



50
51
52
53
54
55
56
57
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 50

def timeout_proposals(**)
  open  = proposal_store.open_proposals
  timed = open.select { |p| Time.now.utc - p[:created_at] > Helpers::Layers::VOTE_TIMEOUT }
  timed.each { |p| proposal_store.resolve_timed_out(p[:proposal_id]) }
  timed_ids = timed.map { |p| p[:proposal_id] }
  log.debug "[governance] vote timeout sweep: open=#{open.size} timed_out=#{timed.size}"
  { checked: open.size, timed_out: timed.size, timed_out_ids: timed_ids }
end

#validate_action(layer:, action: nil, _context: {}) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 59

def validate_action(layer:, action: nil, _context: {}, **) # rubocop:disable Lint/UnusedMethodArgument
  return { error: :invalid_layer } unless Helpers::Layers.valid_layer?(layer)

  result = case layer
           when :agent_validation
             { allowed: true, layer: layer, reason: :self_validated }
           when :anomaly_detection
             { allowed: true, layer: layer, reason: :no_anomaly }
           when :human_deliberation
             { allowed: false, layer: layer, reason: :requires_human_approval }
           when :transparency
             { allowed: true, layer: layer, reason: :logged, audit_required: true }
           end
  log.debug "[governance] validate: layer=#{layer} allowed=#{result[:allowed]} reason=#{result[:reason]}"
  result
end

#vote_on_proposal(proposal_id:, voter:, approve:) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/legion/extensions/agentic/social/governance/runners/governance.rb', line 23

def vote_on_proposal(proposal_id:, voter:, approve:, **)
  result = proposal_store.vote(proposal_id, voter: voter, approve: approve)
  case result
  when nil
    log.debug "[governance] vote failed: proposal=#{proposal_id[0..7]} not found or closed"
    { error: :not_found_or_closed }
  when :already_voted
    log.debug "[governance] vote failed: proposal=#{proposal_id[0..7]} voter=#{voter} already voted"
    { error: :already_voted }
  else
    log.info "[governance] vote: proposal=#{proposal_id[0..7]} voter=#{voter} approve=#{approve} resolution=#{result}"
    { voted: true, resolution: result }
  end
end