Class: Legion::Extensions::Agentic::Social::Governance::Helpers::Proposal

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/social/governance/helpers/proposal.rb

Overview

NOTE: Proposal state is stored in-memory only (@proposals hash). This is a safety-critical system (controls consent and containment approval). Persistence to a durable store (e.g. legion-data) is required so that proposals survive process restarts. Implementing persistence is tracked as a separate task.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProposal

Returns a new instance of Proposal.



19
20
21
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 19

def initialize
  @proposals = {}
end

Instance Attribute Details

#proposalsObject (readonly)

Returns the value of attribute proposals.



17
18
19
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 17

def proposals
  @proposals
end

Instance Method Details

#create(category:, description:, proposer:, council_size: Layers::MIN_COUNCIL_SIZE) ⇒ Object



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

def create(category:, description:, proposer:, council_size: Layers::MIN_COUNCIL_SIZE)
  id = SecureRandom.uuid
  @proposals[id] = {
    proposal_id:   id,
    category:      category,
    description:   description,
    proposer:      proposer,
    council_size:  council_size,
    votes_for:     [],
    votes_against: [],
    status:        :open,
    created_at:    Time.now.utc,
    resolved_at:   nil
  }
  id
end

#get(proposal_id) ⇒ Object



57
58
59
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 57

def get(proposal_id)
  @proposals[proposal_id]
end

#open_proposalsObject



61
62
63
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 61

def open_proposals
  @proposals.values.select { |p| p[:status] == :open }
end

#resolve_timed_out(proposal_id) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 65

def resolve_timed_out(proposal_id)
  prop = @proposals[proposal_id]
  return nil unless prop && prop[:status] == :open

  prop[:status]      = :timed_out
  prop[:resolved_at] = Time.now.utc
  prop
end

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



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 40

def vote(proposal_id, voter:, approve:)
  prop = @proposals[proposal_id]
  return nil unless prop && prop[:status] == :open

  # Prevent double-voting
  all_voters = prop[:votes_for] + prop[:votes_against]
  return :already_voted if all_voters.include?(voter)

  if approve
    prop[:votes_for] << voter
  else
    prop[:votes_against] << voter
  end

  check_resolution(proposal_id)
end