Scrutinio e riconteggio
Il risultato non è mai un blocco del registro: è un ricalcolo deterministico, a partire dalla configurazione pubblicata e dalle schede firmate, che chiunque può ripetere.
Ciò che fa fede è l’elenco immutabile delle schede firmate; il ricalcolo ne è una verifica incrociata. Una divergenza tra due implementazioni o due versioni della libreria sarebbe un difetto di un programma di calcolo, non una falla di verificabilità: le schede pubblicate restano invariate. Tutti i metodi proposti sono deterministici, quindi il risultato è stabile per un dato elenco di schede.
Protocollo v1
Che cosa legge il riconteggio.
Soltanto dati pubblici: la configurazione congelata (blocco 0), le schede (blocchi di voti), la lista elettorale di chiusura per i pesi e il metodo pubblicato con il risultato. Il documento CEF non è un dato in ingresso necessario.
-
candidates[].labelstringhe · configuration - I candidati dichiarati, compresi quelli che nessuno ha classificato. L’etichetta è l’unico identificativo del candidato.
-
election_typepreferential | fptp · configuration - Classifica (metodi Condorcet) o scelta singola (scrutinio maggioritario). Determina anche la regola di classifica implicita.
-
ballot_rulesoggetto · configuration - I quattro parametri della scheda, da cui i vincoli di scrutinio discendono secondo una regola fissa (qui sotto).
-
seatsintero ≥ 1 · configuration - Il numero di eletti: le prime seats posizioni della classifica.
-
weighted_votingbooleano · configuration - Se vero, ogni scheda pesa il peso firmato nel suo payload; altrimenti ogni scheda pesa 1.
-
ballots[].payloadstringa JSON · votes - Il payload firmato: il suo campo ballot (classifica CEF o /EMPTY_RANKING/) e il suo campo weight.
-
electoral_roll[].weightintero ≥ 1 · closure - Il peso autorizzato di ciascun elettore, per controllare i pesi firmati di un’elezione ponderata.
-
metodonome canonico · risultato - Scelto dall’organizzatore, congelato con la configurazione all’avvio, pubblicato con il risultato e non nella catena. Indicato con il suo nome esatto nella libreria, per esempio Schulze Winning.
Ogni scheda pubblicata, una regola meccanica.
Il contenuto di una scheda non viene convalidato al deposito: decide lo scrutinio, secondo una regola pubblica e deterministica. Una scheda scartata resta pubblicata e verificabile; è soltanto esclusa dalla classifica.
- 1 Verificare. Ogni scheda pubblicata reca una firma ad anello valida e un’immagine di chiave unica nell’elezione: la piattaforma lo controlla alla ricezione, il verificatore lo ricontrolla. Un esito negativo sarebbe un difetto del registro, non una regola di scrutinio.
- 2 Filtrare il formato. Il campo ballot supera il controllo rigoroso di cef-writer: una stringa vuota, il separatore di tag ||, un rango vuoto (A>>B), UTF-8 non valido, un a capo, i caratteri riservati ; , # / * ^ o un candidato ripetuto lo respingono. L’analizzatore della libreria lo legge poi, e può a sua volta rifiutarlo. Una scheda respinta è nulla per formato: non diventa mai un voto.
- 3 Riconoscere la scheda bianca. La sentinella /EMPTY_RANKING/ è una scheda bianca: un’astensione, conteggiata.
- 4 Applicare i vincoli. I vincoli dedotti da ballot_rules classificano ogni voto come valido o nullo per vincolo. Una classifica che nomina un candidato non dichiarato conta come espressa; il nome sconosciuto è ignorato nei confronti a coppie.
- 5 Pesare. In un’elezione ponderata, il peso applicato è il weight del payload firmato, mai un moltiplicatore letto nella classifica (il filtro di formato lo vieta). I pesi firmati devono formare esattamente il multinsieme dei pesi degli elettori contrassegnati has_voted, la cui somma vale totals.voted_weight. Senza ponderazione, ogni voto pesa 1.
Dai parametri ai vincoli
-
NoTiese ties_allowed = false - Respinge un voto che esprime una parità, compresa la parità implicita dei candidati non classificati di una classifica parziale.
-
NoBlankVotese blank_allowed = false - Respinge la scheda bianca: diventa allora nulla per vincolo anziché bianca.
-
CompleteRankingse partial_ranking_allowed = false - Respinge una classifica che non nomina esplicitamente tutti i candidati.
-
Implicit Rankingsecondo election_type - Attiva per preferential: un candidato non classificato è a pari merito all’ultimo posto. Disattiva per fptp: una scelta singola lascia gli altri candidati non classificati.
I vincoli non sono pubblicati in quanto tali: discendono dai parametri pubblicati secondo questa regola. Una scheda bianca è un’astensione, né una parità né una classifica parziale: NoTie e CompleteRanking la esentano, solo NoBlankVote la respinge. La piattaforma applica questa esenzione mediante proprie varianti dei vincoli nativi di CondorcetPHP; un riconteggio indipendente deve riprodurla.
Per un’elezione fptp i parametri pubblicati sono fissi (parità vietate, classifica parziale ammessa, classifica completa mai richiesta): NoTie si applica sempre, NoBlankVote quando l’astensione è vietata. Una classifica con più preferenze vi è letta alla sua prima preferenza.
Sei contatori, due invarianti.
Calcolati una volta per scrutinio, identici per tutti i metodi. Un riconteggio con gli stessi vincoli deve riprodurli esattamente.
-
totalintero - I voti registrati dalla libreria.
-
validintero - I voti che superano tutti i vincoli.
-
expressedintero - I voti validi e non bianchi: quelli che formano la classifica.
-
blankintero - I voti validi con classifica vuota (/EMPTY_RANKING/).
-
invalidByConstraintintero - I voti registrati ma respinti da un vincolo: i nulli per vincolo.
-
invalidByFormatintero - Le schede che non sono mai diventate un voto: i nulli per formato, esclusi da total.
total = valid + invalidByConstraint; valid = expressed + blank. Il numero di nulli pubblicato è invalidByFormat + invalidByConstraint. La stessa ripartizione, sommata per peso anziché per scheda, dà i voti di un’elezione ponderata (senza corrispettivo per invalidByFormat: quelle schede non hanno peso); senza ponderazione ricopia i conteggi.
Un metodo, fissato prima del voto.
La piattaforma non implementa alcun algoritmo di voto: ogni metodo è quello della libreria julien-boudry/condorcet (CondorcetPHP), indicato con il suo nome esatto. Il tipo di elezione è pubblicato nel blocco 0; il metodo, scelto dall’organizzatore, è congelato con la configurazione all’avvio e pubblicato con il risultato.
-
FPTPfptp - Scrutinio maggioritario uninominale: vince il candidato con più voti, con più peso in un’elezione ponderata. Il risultato resta una classifica completa.
-
Schulze Winningpreferential · predefinito - Schulze, variante dei voti vincenti.
-
Schulze Marginpreferential - Schulze, variante dei margini.
-
Ranked Pairs Winningpreferential - Ranked Pairs (Tideman), variante dei voti vincenti.
-
Ranked Pairs Marginpreferential - Ranked Pairs (Tideman), variante dei margini.
-
Copelandpreferential - Il metodo di Copeland.
-
Dodgson Quickpreferential - L’approssimazione polinomiale del metodo di Dodgson.
- Una variante, un nome. Ogni variante è una scelta distinta, associata uno a uno al nome canonico della libreria: il metodo registrato si ripete tale e quale.
- Solo metodi deterministici. Non è proposto alcun metodo non deterministico: le stesse schede danno sempre lo stesso risultato.
- La ponderazione non è un metodo. Con weighted_voting si applica lo stesso metodo, ogni voto con il proprio peso, che la libreria conteggia nativamente.
- I seggi sono un taglio. Gli eletti sono le prime seats posizioni della classifica restituita; nient’altro viene calcolato. I metodi proporzionali della libreria non sono proposti.
- Metodi secondari, a titolo indicativo. Per un’elezione Condorcet, la pagina dei risultati può mostrare la classifica che gli altri metodi dell’elenco avrebbero prodotto con le stesse schede. Solo il metodo principale costituisce il risultato ufficiale.
Nessuno spareggio inventato.
La piattaforma riporta ciò che restituisce la libreria e non ritocca mai il vincitore.
- Ranghi condivisi. La classifica è numerata a partire da 1; i candidati a pari merito condividono lo stesso rango.
- Cicli. In assenza di un vincitore di Condorcet, il ciclo è risolto dal metodo configurato, e soltanto da esso.
- Parità al taglio dei seggi. Se una parità si trova a cavallo del confine tra la N-esima e la (N+1)-esima posizione, nessuno è dichiarato eletto oltre il confine. L’organizzatore decide al di fuori della piattaforma, di norma con un ballottaggio organizzato come una nuova elezione.
- Nessuna scheda. Senza schede non c’è nulla da scrutinare: il risultato ufficiale è vuoto (conteggi a zero, classifica vuota, nessun eletto), senza ricorrere alla libreria.
La versione del calcolo, registrata con il risultato.
Ogni risultato registra quanto serve per ripetere esattamente la stessa semantica: la versione del contratto di scrutinio, la versione della libreria e il metodo. La pagina pubblica dei risultati mostra il metodo e, per un’elezione Condorcet, la versione della libreria.
-
engine_contract_versionintero · oggi 1 - La versione del contratto di scrutinio (visualizzabile come « v1 »): la forma del documento di risultato e le regole di conteggio descritte in questa pagina.
-
condorcet_library_versionstringa - La versione di julien-boudry/condorcet che ha calcolato il risultato (Condorcet::VERSION).
-
methodstringa - Il nome canonico del metodo, così come lo riporta la libreria (Result->fromMethod).
-
counts, weightsoggetti - I sei contatori qui sopra e il loro corrispettivo ponderato.
Il documento di risultato è conservato così come lo produce la libreria: per ogni metodo, la classifica, il vincitore e il perdente, il vincitore e il perdente di Condorcet, gli avvisi; facoltativamente, la matrice dei confronti a coppie. L’unica operazione aggiunta dalla piattaforma è il taglio delle prime seats posizioni.
Una comodità, non un elemento del protocollo.
Concluso lo scrutinio e pubblicato il risultato, la pagina dei risultati offre le schede nel Condorcet Election Format (CEF), un formato testuale aperto con specifica pubblica, leggibile dalla libreria Condorcet come da qualsiasi implementazione conforme.
- Mai necessario. Il documento si ricostruisce dal solo registro: un verificatore può rigenerarlo per confrontarlo con il file servito, e il riconteggio non ne ha bisogno.
- Né vincoli né metodo. Non vi figurano: si leggono in ballot_rules e nel risultato pubblicati.
- Rigenerato a ogni scrutinio. Prodotto dopo ogni scrutinio riuscito, anche per un’elezione senza schede; un nuovo scrutinio produce un nuovo documento. Non viene mai eliminato.
- /elections/{election}/results/ballots.cef
- Reindirizza al documento archiviato, una volta pubblicata l’elezione e concluso lo scrutinio.
Contenuto del documento
-
#/Candidates:parametro - Le etichette ufficiali, dichiarate in apertura: un candidato che nessuno ha classificato esiste comunque.
-
#/Implicit Ranking:parametro - true per un’elezione preferential, false per un’elezione fptp.
-
#/Weight Allowed:parametro, solo ponderazione - Presente solo in un’elezione ponderata; ogni riga di voto reca allora il proprio peso firmato.
-
una riga per schedaclassifica CEF - Il campo ballot di ogni payload pubblicato, scritto da cef-writer, schede bianche /EMPTY_RANKING/ comprese. Le schede nulle per formato non vi figurano.
Ripetere lo scrutinio in autonomia.
Con la libreria di riferimento alla versione registrata, il riconteggio riproduce la classifica e i conteggi in modo identico. Qualsiasi altra implementazione conforme al CEF dovrebbe, in teoria, giungere allo stesso risultato.
- 1 Scarichi il registro dell’elezione e verifichi ogni scheda: firma, unicità delle immagini di chiave, coerenza con la lista elettorale e, in un’elezione ponderata, con i pesi.
- 2 Legga nel blocco 0 i candidati, il tipo, ballot_rules, seats e weighted_voting; ne deduca i vincoli e la regola di classifica implicita.
- 3 Scriva ogni payload pubblicato in CEF con cef-writer, oppure applichi lo stesso filtro di formato, con il suo peso firmato se l’elezione è ponderata; gli scarti sono le schede nulle per formato.
- 4 Calcoli con julien-boudry/condorcet, alla versione registrata, il metodo pubblicato con il risultato, con i vincoli dedotti, esentando la scheda bianca da NoTie e da CompleteRanking.
- 5 Confronti la classifica e i sei contatori con il risultato pubblicato, quindi legga gli eletti: le prime seats posizioni.
Vedi anche
- Registro pubblico Ciò che ogni elezione pubblica, indipendentemente dal mezzo di trasmissione: definizione, anelli, registro delle presenze, schede.
- Procedura di verifica Verificare un'elezione da cima a fondo: dal solo registro, oppure con la blockchain.
- Scheda firmata La scheda così come l'elettore la firma: payload firmato, firma ad anello, immagine di chiave, digest dell'anello.