Então pensei em tentar resolver este problema como minha primeira contribuição, mas parece que pode ser um pouco mais complicado do que eu esperava. 
Tenho um Draft PR aberto: FIX: do not return duplicates from /polls/voters.json by clechasseur · Pull Request #1 · clechasseur/discourse · GitHub
Neste PR, primeiro adicionei testes que reproduzem o problema, depois apliquei a correção simples de Rob e isso fez com que os testes passassem.
Também tentei a solução mais elegante (aquela que eu teria preferido), mas embora ela impeça eleitores duplicados, ela também altera qual eleitor é retornado em qual página, incluindo a primeira, o que potencialmente poderia ser considerado uma alteração que quebra a compatibilidade (dependendo de como o front-end lida com isso - ainda não olhei).
Dando um passo atrás, no entanto, fico me perguntando qual é o verdadeiro significado do parâmetro limit ao chamar este endpoint - ele não limita realmente o número de eleitores totais retornados, apenas o número de eleitores retornados para cada opção de enquete. Você pode ver esse efeito no teste que adicionei para a enquete de múltipla escolha aqui - a primeira página é de fato limitada a 2 eleitores por opção, mas no total, três eleitores diferentes são retornados (espalhados entre as opções). Mudar para a solução elegante (ou seja, usar LIMIT :limit OFFSET :offset) resulta no limit sendo aplicado ao número total de votos e não de eleitores. Não tenho 100% de certeza se é melhor ou mais intuitivo.
De qualquer forma, sou novo nisso, então posso estar pensando demais. A solução simples remove eleitores duplicados e não causa muitos estragos, então pode ser o caminho a seguir. Aguardarei feedback antes de enviar um PR para o repositório pai.
–
Parênteses, acho que há outro bug nesta parte do código. A consulta para carregar eleitores é ordenada por digest, rank e username - mas ao ordenar por rank, ela usa esta condição:
CASE WHEN rank = 'Abstain' THEN 1 ELSE CAST(rank AS integer) END
No entanto, ’Abstain’ na verdade corresponde ao rank 0, não 1 - o rank 1 também pode ser retornado como ’1’. Isso potencialmente torna a ordenação não determinística entre as consultas, o que significa que, dependendo do número de eleitores e do valor de limit usado, pode ser possível perder eleitores ao fazer consultas paginadas. Nos meus novos testes, tive que classificar os eleitores retornados para contornar a natureza não determinística. (Como é não determinístico, presumo que não seja fácil de reproduzir em um teste, mas posso tentar…)