Casting a vote

Votes are Ed25519-signed records over the proposal ID + choice + timestamp. Signatures prevent after-the-fact tampering.
await orgs.proposals.vote(proposalId, {
  choice: "approve",
  weight: 1.0, // for weighted methods
  reason: "...", // optional, included in audit chain
});

Vote weights

Weight depends on the constitution’s voting_method:

one-person-one-vote

Every member: weight = 1.

token-weighted

Weight = token balance at the snapshot block (taken when proposal opens for voting). Requires an on-chain token tracked in the constitution.

quadratic

Weight = √(token balance). Limits plutocracy; widely used in Gitcoin-style funding.

delegation

Members can delegate weight to other members:
# in constitution.yaml
governance:
  voting_method: delegation
  delegation:
    allowed: true
    max_depth: 2     # prevents long chains
    revocable: true

conviction

Weight grows as a member maintains their position over time. Implements conviction-voting mechanics (integral of preference over time).

multisig

N-of-M signing. Used for treasury-only entities.

Counting

At the end of the voting period:
  1. Quorum check(votes_cast / total_members) >= constitution.governance.quorum
  2. Threshold check(approves / cast_votes) >= constitution.governance.voting_threshold
Both must be true to approve. Either failing → rejected. Weighted-voting methods substitute sum(weight * approve_choice) and sum(weight) respectively.

Edge cases

  • Abstentions — count toward quorum but not toward threshold
  • Delegated votes — propagated up the delegation chain (max depth enforced)
  • Tierejected (threshold not met by definition)
  • Voter departs mid-vote — their vote stands; their position leaving is a separate event
  • Voting period expires — computed at expiration; if approved, executable immediately

Audit trail

Every vote writes an audit chain entry:
{
  "event": "proposal.vote.cast",
  "proposal": "prop-2026-04-12-0031",
  "voter": "did:oas:human:hr-01-a4f2",
  "choice": "approve",
  "weight": 1.0,
  "reason": "Q2 compute is budgeted; this is within plan.",
  "signature": "ed25519::...",
  "hash": "blake3::...",
  "prev": "blake3::..."
}