Editing Maemo.org team/How Elections Work

Warning: You are not logged in. Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
-
This page details the current [http://maemo.org/vote voting system] and how it works.  It is presented as a means of offering transparency into how voting is handled and how the current system provides both anonymity and verifiability in community elections and referendums.  
+
This page details the current [http://maemo.org/vote voting system] and how it works.  It is presented as a means of offering transparency into how voting is handled and how the current system provides both anonymity and verifiability in community elections and referendums.
= Overview =
= Overview =
Line 5: Line 5:
The voting system provides voters with a multiple-choice interface which can be used to create an ordered list of selected options.  Voters can select some, none, or all of the choices, and order those choices as they prefer them.
The voting system provides voters with a multiple-choice interface which can be used to create an ordered list of selected options.  Voters can select some, none, or all of the choices, and order those choices as they prefer them.
-
For multi-seat elections, voters may choose any number of candidates, be that greater than, equal to, or less than the number of seats (see Single Transferable Vote below). For the special case of a two-choice referendum, voters should be aware that there is no (additional) sense in choosing both options, though the voting system may in fact allow them to do so. ''Only the first selection in a 2 option election will be counted.''
+
For multi-seat elections, voters may choose any number of candidates, be that greater than, equal to, or less than the number of seats (see Single Transferable Vote below). For the special case of a two-choice referendum, voters should be aware that there is no sense in choosing both options, though the voting system may in fact allow them to do so.
-
Voters that dislike the choices, or want a choice not presented, may show their desire to participate by choosing nothing and casting an empty ballot. If enough voters cast empty ballots it can affect an election by making fewer (or no) candidates reach the required "quorum" levels to be elected.
+
Voters that dislike the choices, or want a choice not presented, may show their desire to participate by choosing nothing and casting an empty ballot. If enough voters cast empty ballots it can affect an election by making fewer (or no) candidates reach the required "quorum" levels to be elected.  
= Parts of an Election =
= Parts of an Election =
Line 19: Line 19:
== Electorate ==
== Electorate ==
-
The system also contains an electorate list; the list of ''users eligible to vote'' in an election.  That list generally gets updated from the main maemo.org list before elections are started. The date this happens is the relevant date for calculating karma, account age, and so on. Only users that meet the conditions ''at that date'' are included to the electorate table.  It is '''difficult''' (but not impossible) to update or adjust this list after elections have started.  To avoid complexity it is asked that voters check their account settings, '''particularly their email address,''' and setup any linkages needed at least a few weeks before elections start.
+
The system also contains an electorate list; the list of ''users eligible to vote'' in an election.  That list generally gets updated from the main maemo.org list before elections are started.  It is '''difficult''' (but not impossible) to update or adjust this list after elections have started.  To avoid complexity it is asked that voters check their account settings and setup any linkages needed at least a few weeks before elections start.
== Voting Tokens ==
== Voting Tokens ==
Line 31: Line 31:
The entire voting process is state driven.  When a voter chooses an election and logs in, the system validates the token to allow them into the voting interface.  This is a "courtesy validation" to allow the voter to know that the token is still valid.  Nothing is altered by this step.
The entire voting process is state driven.  When a voter chooses an election and logs in, the system validates the token to allow them into the voting interface.  This is a "courtesy validation" to allow the voter to know that the token is still valid.  Nothing is altered by this step.
-
The list of choices is presented to the voter, and stored in a ''javascript applet'' in the voters browser that allows the voter to chose as many options as they like, in the order they like (note that you can undo choices by clicking on the list of chosen items).  When the voter is happy with their choice(s) and proper order, they submit the choices for validation and confirmation.  The vote selection is validated, displayed to the voter to confirm that the system got their choice(s) and order correct, and the voter is asked to submit the vote for final processing.
+
The list of choices is presented to the voter, and stored in a javascript applet that allows the voter to chose as many options as they like, in the order they like.  When the voter is happy with their choice(s), they submit the choices for validation and confirmation.  The vote selection is validated, displayed to the voter to confirm that the system got their choice(s) correct, and the voter is asked to submit the vote for final processing.
The next step is the most complex and critical.  Once the vote has been submitted, several things happen all in one single action:
The next step is the most complex and critical.  Once the vote has been submitted, several things happen all in one single action:
Line 49: Line 49:
The first sub-step generates a random validation string for your vote.  When the vote is stored in the vote table, that is the *only* reference as to "who" cast this vote.  Being that it's random, the only way one can know it is by seeing it on their screen, just after submitting their vote.  This is important because '''it allows each voter to validate the public ballot later''' by looking up their unique entry to verify their vote was counted as they cast it.
The first sub-step generates a random validation string for your vote.  When the vote is stored in the vote table, that is the *only* reference as to "who" cast this vote.  Being that it's random, the only way one can know it is by seeing it on their screen, just after submitting their vote.  This is important because '''it allows each voter to validate the public ballot later''' by looking up their unique entry to verify their vote was counted as they cast it.
-
The third step guarantees that a voter always has either a vote token, or has a vote cast with a random validation string.  This prevents multiple votes per voter, and prevents technical problems from leaving a voter stranded without a vote.  For this reason, '''at any time up to the point one hits the "submit vote" button on the validation page, and gets a validation token random string displayed, one may close their browser, or hit back, to change their choices, or start all over anew with the process.'''
+
The third step guarantees that a voter always has either a vote token, or has a vote cast with a random validation string.  This prevents multiple votes per voter, and prevents technical problems from leaving a voter stranded without a vote.  For this reason, at any time up to the point one hits the "submit vote" button on the validation page, one may close their browser, or hit back, to change their choices.
== Post Election Ballot Validation ==
== Post Election Ballot Validation ==
-
Once the vote has closed, the ballot of all votes cast is ''publicly'' viewable (and downloadable) by everyone.  The list includes the votes cast, including the order of the choices for multi-choice votes, and the random validation strings for each vote.  Since each voter knows his or her validation string, they can validate their vote is correct.  They can also count the votes, and validate that the ''results'' of the election are correct.  But since only one random validation string is known per voter, voters (as well as admins) can not determine who voted for which candidates in the election.  Since there are no links to the original owner or starting token in the final voting table, there's also no way for an administrator (or anyone with database access) to determine who voted for which candidates either.
+
Once the vote has closed, the ballot of all votes cast is ''publicly'' viewable (and downloadable) by everyone.  The list includes the votes cast, including the order of the choices for multi-choice votes, and the random validation strings for each vote.  Since each voter knows his or her validation string, they can validate their vote is correct.  They can also count the votes, and validate that the ''results'' of the election are correct.  But since only one random validation string is known per voter, voters can not determine who voted for which candidates in the election.  Since there are no links to the original owner or starting token in the final voting table, there's also no way for an administrator (or anyone with database access) to determine who voted for which candidates either.
= Technical Details =
= Technical Details =
Line 92: Line 92:
|-
|-
| election_tmp_tokens
| election_tmp_tokens
-
| This contains the list of all tokens for all elections.  Each token knows which voter and election it belongs to (via numeric index). Obsolete tokens (for elections that are closed) shall get deleted from this table.
+
| This contains the list of all tokens for all elections.  Each token knows which voter and election it belongs to (via numeric index).
|-
|-
| election_votes
| election_votes
Line 101: Line 101:
|-
|-
| midgard_users
| midgard_users
-
| This is a temporary table, imported from Midgard and/or the garage to allow scripts to update the electorate in an easier fashion. Creation date of this table determines the karma, account age etc used to decide eligibility of a user.
+
| This is a temporary table, imported from Midgard and/or the garage to allow scripts to update the electorate in an easier fashion.
|-
|-
| outbound_email
| outbound_email
-
| This system handles queuing and batching mail to prevent us from looking like spammers. Temporary table. Depletes as mails get sent out.
+
| This system handles queuing and batching mail to prevent us from looking like spammers.
|}
|}
Line 111: Line 111:
One option available for administrators is to "clone" voting tokens from one election into another.  This allows one "password" to be used in two or more elections.  This process is often desirable when two elections are happening at the same time or in close succession, as it cuts down on the number of tokens mailed out, and eliminates confusion about which voting token string to use for a given election.
One option available for administrators is to "clone" voting tokens from one election into another.  This allows one "password" to be used in two or more elections.  This process is often desirable when two elections are happening at the same time or in close succession, as it cuts down on the number of tokens mailed out, and eliminates confusion about which voting token string to use for a given election.
-
For example, the Coding Competitions often have 5 to 10 categories, each with a separate election.  Having 5 to 10 tokens mailed to voters could cause spam triggers, and/or could confuse voters as to which token to use for which category.  Instead, one token is created, and cloned to the other categories.  The allows a voter to use the same e-mail and password to vote in all Coding Competition elections, but still only allows one vote per voter per category.  
+
For example, the Coding Competitions often have 5 to 10 categories, each with a separate election.  Having 5 to 10 tokens mailed to voters could cause spam triggers, and/or could confuse voters as to which token to use for which category.  Instead, one token is created, and cloned to the other categories.  The allows a voter to use the same e-mail and password to vote in all Coding Competition elections, but still only allows one vote per voter per category.
Cloning works because each token has a reference to the voter and election for which it exists.  When a token is cloned a '''copy''' is made with a ''different'' election identifier.  This means two tokens exist with the same random "string", but each points to the same user and a ''different'' election.  When a voter casts a vote in one election, just the token for that election gets destroyed.
Cloning works because each token has a reference to the voter and election for which it exists.  When a token is cloned a '''copy''' is made with a ''different'' election identifier.  This means two tokens exist with the same random "string", but each points to the same user and a ''different'' election.  When a voter casts a vote in one election, just the token for that election gets destroyed.
Line 121: Line 121:
!
!
! align="center"| Voting Tokens
! align="center"| Voting Tokens
-
! align="center"|           Votes & Verify Strings              
+
! align="center"| Votes & Verify Strings
|-
|-
! Setup Referendum 1  
! Setup Referendum 1  
|
|
-
  '''(3UA9VTp,Alice,Ref1)'''  
+
  '''(3UA9VTp,Andy,Ref1)'''  
  '''(oUB3VTq,Bob,Ref1)'''
  '''(oUB3VTq,Bob,Ref1)'''
  '''(yUC9VTr,Chad,Ref1)'''
  '''(yUC9VTr,Chad,Ref1)'''
-
  ... [all eligible electorate]  
+
  ...  
 +
  '''(wUZ3VT5,Zarrah,Ref1)'''
|  
|  
|-
|-
! Clone Referendum 1 to Election 2  
! Clone Referendum 1 to Election 2  
|
|
-
  (3UA9VTp,Alice,Ref1)
+
  (3UA9VTp,Andy,Ref1)
  (oUB3VTq,Bob,Ref1)  
  (oUB3VTq,Bob,Ref1)  
  (yUC9VTr,Chad,Ref1)
  (yUC9VTr,Chad,Ref1)
  ...  
  ...  
-
  '''(3UA9VTp,Alice,Elect2)'''  
+
(wUZ3VT5,Zarrah,Ref1)
 +
  '''(3UA9VTp,Andy,Elect2)'''  
  '''(oUB3VTq,Bob,Elect2)'''
  '''(oUB3VTq,Bob,Elect2)'''
  '''(yUC9VTr,Chad,Elect2)'''  
  '''(yUC9VTr,Chad,Elect2)'''  
  ...  
  ...  
 +
'''(wUZ3VT5,Zarrah,Elect2)'''
|
|
|-
|-
-
! Alice & Chad Vote In Referendum 1  
+
! Andy & Chad Vote In Referendum 1  
|
|
-
  <strike>(3UA9VTp,Alice,Ref1)</strike>
+
  <strike>(3UA9VTp,Andy,Ref1)</strike>
  (oUB3VTq,Bob,Ref1)
  (oUB3VTq,Bob,Ref1)
  <strike>(yUC9VTr,Chad,Ref1)</strike>
  <strike>(yUC9VTr,Chad,Ref1)</strike>
  ...  
  ...  
-
  (3UA9VTp,Alice,Elect2)  
+
(wUZ3VT5,Zarrah,Ref1)
 +
  (3UA9VTp,Andy,Elect2)  
  (oUB3VTq,Bob,Elect2)
  (oUB3VTq,Bob,Elect2)
  (yUC9VTr,Chad,Elect2)
  (yUC9VTr,Chad,Elect2)
  ...  
  ...  
 +
(wUZ3VT5,Zarrah,Elect2)
|
|
  '''"Yes" &rArr; OMGuVotedN0wg0prty (Ref1)'''
  '''"Yes" &rArr; OMGuVotedN0wg0prty (Ref1)'''
  '''"No" &rArr; Yualw4ysSoN3gatlve (Ref1)'''
  '''"No" &rArr; Yualw4ysSoN3gatlve (Ref1)'''
|-
|-
-
! Alice & Bob Vote In Election 2  
+
! Andy & Bob Vote In Election 2  
|
|
  (oUB3VTq,Bob,Ref1)  
  (oUB3VTq,Bob,Ref1)  
  ...
  ...
  (wUZ3VT5,Zarrah,Ref1)
  (wUZ3VT5,Zarrah,Ref1)
-
  <strike>(3UA9VTp,Alice,Elect2)</strike>  
+
  <strike>(3UA9VTp,Andy,Elect2)</strike>  
  <strike>(oUB3VTq,Bob,Elect2)</strike>  
  <strike>(oUB3VTq,Bob,Elect2)</strike>  
  (yUC9VTr,Chad,Elect2)
  (yUC9VTr,Chad,Elect2)
  ...
  ...
 +
(wUZ3VT5,Zarrah,Elect2)
|
|
  "Yes" &rArr; OMGuVotedN0wg0prty (Ref1)
  "Yes" &rArr; OMGuVotedN0wg0prty (Ref1)
  "No"  &rArr; Yualw4ysSoN3gatlve (Ref1)
  "No"  &rArr; Yualw4ysSoN3gatlve (Ref1)
-
  '''"Kyle","Lucy" &rArr; M4nUVote4YurBudzEh (Elect2)'''
+
  '''"Kyle","Chad" &rArr; M4nUVote4YurBudzEh (Elect2)'''
-
  '''"Jim","Mandy" &rArr; OMGuVotedTo0g0prty (Elect2)'''
+
  '''"Jim","Sally" &rArr; OMGuVotedTo0g0prty (Elect2)'''
|}
|}

Learn more about Contributing to the wiki.


Please note that all contributions to maemo.org wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see maemo.org wiki:Copyrights for details). Do not submit copyrighted work without permission!


Cancel | Editing help (opens in new window)