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
- #create_proposal(category:, description:, proposer:, council_size: nil) ⇒ Object
- #get_proposal(proposal_id:) ⇒ Object
- #open_proposals ⇒ Object
- #timeout_proposals ⇒ Object
-
#validate_action(layer:, action: nil, _context: {}) ⇒ Object
rubocop:disable Lint/UnusedMethodArgument.
- #vote_on_proposal(proposal_id:, voter:, approve:) ⇒ Object
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_proposals ⇒ Object
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_proposals ⇒ Object
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 |