# Finding a Bloc STAR provider

**URL:** <https://discuss.python.org/t/finding-a-bloc-star-provider/73918>\
**Category:** Core Development\
**Tags:** governance\
**Created:** [December 11, 2024, 2:02am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918 "2024-12-11T02:02:06Z")\
**Posts on this page:** 20\
**Page:** 3

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 14, 2024, 1:35am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/43 "2024-12-14T01:35:53Z")

</div>

> [@tim.one](#):
>
> And there’s a new test election, [here](https://bettervoting.com/wrwj3p).
> 
> Changes:
> 
> - This one ends, December 13, 2024 at 10:00 PM UTC.
> - Results are _not_ v\visible before it ends.

And that’s over now. I don’t currently plan to run another announced test. Curiously, it says:

> Election ended on December 14, 2024 at 1:31 AM UTC

So it ended about 3.5 hours after the configured ending time. Why? Don’t know, and no guess. My own time zone is UTC minus 5 hours, so that’s not it.

---

<div class="post-metadata">

**Author:** ![MegaIng](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/megaing/32/16162_2.png) [@MegaIng](https://discuss.python.org/u/MegaIng)\
**Post date:** [December 14, 2024, 2:42am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/44 "2024-12-14T02:42:42Z")

</div>

A few things are definitely wrong here:

- I can’t see the results, I am getting an error message `Error making request: 401: Does not have permission (1aedfc99)`
- For me the ending time is 2:40 AM UTC, or, most likely, the current time

So even if the software is good under the hood the UI and frontend in general has a few potentially serious issues before this site can be used. But a year of lead time and responsive developers should take care of this.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 14, 2024, 4:06am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/45 "2024-12-14T04:06:58Z")

</div>

> [@MegaIng](#):
>
> A few things are definitely wrong here:
> 
> - I can’t see the results, I am getting an error message `Error making request: 401: Does not have permission (1aedfc99)`

Thank you for trying! This one is shallow (I hope): I didn’t realize that I, as the election admin, needed to explicitly do something to make the results available after the election ended on its own. I clicked that button now, and the results should be visible to everyone now.

> [@](#):
>
> - For me the ending time is 2:40 AM UTC, or, most likely, the current time

Bingo! Current local time for me too, but expressed in UTC (I messed up on what my UTC offset actually is before). I reported that via the “Feedback” button (lower right of page).

> [@](#):
>
> So even if the software is good under the hood the UI and frontend in general has a few potentially serious issues before this site can be used. But a year of lead time and responsive developers should take care of this.

To my eyes, it’s gone very well so far for a beta release. I just contributed 100 bucks to help 'em out 😄.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 14, 2024, 7:56am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/46 "2024-12-14T07:56:59Z")

</div>

> [@tim.one](#):
>
> Here’s the Python code. I expect it would be easy to rewrite in any language and work the same way.

Primarily for @ArendPeter and @larry:

More thoughts on randomization: my little 16-bit generator has such a short period that “most” permutations of a 10-element list can never be generated. Essentially the same is true of all PRNGs, but in the case of the Mersenne Twister, with monstrously large period, it takes lists with a few thousand elements before most permutations are out of reach.

A saving grace for us is that we don’t much care about speed. Things like the Twister can be called trillions of times in a program run and speed matters a lot. Here we only need to shuffle a list of candidates, at most once per ballot.

There is a standard way to greatly increase the period and improve quality, which maybe takes twice as long: apply a “Bays-Durham shuffle” to the underlying PRNG. The real cost is that the `.get()` method can no longer guarantee to return unique results across 65536 consecutive calls.

This isn’t a problem for shuffling a list, but would be if you want a `candidate -> unique_int` mapping. I’m proceeding under the belief that shuffling is fundamental, and that if you want a `candidate -> unique_int` mapping instead, it can be easily built from a permutation (e.g., map a candidate to its index in the shuffled list).

So my working code now implements Bays-Durham (just a few lines of easy code), and a form of Fisher-Yates shuffling. It’s still working hard to avoid any Python-unique features or libraries, uses no floats, and never creates an int needing more than 32 bits.

A chi-square test confirms that across `16 * math.factorial(10)` tries at shuffling `list(range(10))`, all possible permutations were generated “about equally as often” as truly random shuffling would do. Same for smaller lists.

Testing this kind of thing is much harder than writing it. Especially including the time tearing out hair when tests fail 😉

---

<div class="post-metadata">

**Author:** ![ArendPeter](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/arendpeter/32/24499_2.png) [@ArendPeter](https://discuss.python.org/u/ArendPeter)\
**Post date:** [December 14, 2024, 8:29am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/47 "2024-12-14T08:29:47Z")

</div>

> To my eyes, it’s gone very well so far for a beta release. I just contributed 100 bucks to help 'em out 😄.

Thank you! 🫶

> Bingo! Current local time for me too, but expressed in UTC (I messed up on what my UTC offset actually is before). I reported that via the “Feedback” button (lower right of page).

Feedback received, will look into it. I also confirmed it on my end.

> - I can’t see the results, I am getting an error message `Error making request: 401: Does not have permission (1aedfc99)`

I’ll work to update this error too. Perhaps “Election has results set to private” or something like that. I should also make it more clear for admins when the page they’re viewing are only visible to them.

> So my working code now implements Bays-Durham (just a few lines of easy code), and a form of Fisher-Yates shuffling. It’s still working hard to avoid any Python-unique features or libraries, uses no floats, and never creates an int needing more than 32 bits.

> A chi-square test confirms that across `16 * math.factorial(10)` tries at shuffling `list(range(10))`, all possible permutations were generated “about equally as often” as truly random shuffling would do. Same for smaller lists.

This is looking great! I’m happy to implement whatever version of TinyRand we end up with, and I’m also fine with moving away from `candidate -> unique_int` (we didn’t consider the possibility for the random generator to giving the same value multiple times 😅)

Bays-Durham + Fisher-Yates sounds like a good way to go.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 14, 2024, 9:23am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/48 "2024-12-14T09:23:40Z")

</div>

I created a GitHub repository so we can keep ongoing developments off Discourse:

> **[GitHub - tim-one/tinyrand: Very simple code for shuffling short lists.](https://github.com/tim-one/tinyrand)**
>
> Very simple code for shuffling short lists.

Feel free to contribute implementations in other languages, in the `src/` directory.

One thing I haven’t thought about yet is how to “version” the code. Sooner or later, some material improvement will be made, but I think it’s crucial that older results still be reproducible here. @larry can think about that too 😄.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 15, 2024, 8:13am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/49 "2024-12-15T08:13:37Z")

</div>

> [@tim.one](#):
>
> One thing I haven’t thought about yet is how to “version” the code. Sooner or later, some material improvement will be made, but I think it’s crucial that older results still be reproducible here.

The Python implementation now exposes a factory function,

`tinyrand.get(version=tinyrand.DEFAULT_VERSION, seed=0)`

which returns an instance of the class implementing the given version. Testing was changed to exercise all supported versions.

A useful addition was creating a version 1, which uses 26-bit state. Since that never creates an int exceeding 52 bits, it’s suitable for a language (like JavaScript) whose native “number type” is IEEE-754 double-precision floats.

I’m at the limit for list sizes I can exhaustively test. Checking lists of size 11 requires doing `16 * factorial(11) = 638,668,800` shuffles, and even under PyPy that takes close to half an hour - and requires RAM to store a dict with about `factorial(11) = 39,916,800` 11-element tuple keys. That’s pushing the limit on the RAM I have too.

I think this is cute 😉 - this is the entire implementation for version 1:

```python
class TinyRand1(TinyRand0):
    VERSION = 1
    BITS = 26

    def __init__ (self, seed=0):
        super(). __init__ (seed)

```

So, at least in Python, supporting multiple versions “forever” looks to be quite easy.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 16, 2024, 6:32pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/50 "2024-12-16T18:32:23Z")

</div>

> [@tim.one](#):
>
> > [@](#):
> >
> > - For me the ending time is 2:40 AM UTC, or, most likely, the current time
> 
> Bingo! Current local time for me too, but expressed in UTC (I messed up on what my UTC offset actually is before). I reported that via the “Feedback” button (lower right of page).

And that’s been repaired. It displays the original end time now:

> **[Picking a better voting method](https://bettervoting.com/wrwj3p)**
>
> just a test

---

<div class="post-metadata">

**Author:** ![Quercus](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/quercus/32/31483_2.png) [@Quercus](https://discuss.python.org/u/Quercus)\
**Post date:** [December 16, 2024, 8:17pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/51 "2024-12-16T20:17:03Z")

</div>

> [@tim.one](#):
>
> It displays the original end time now

That’s great. The OFFICIAL RESULTS pages with the bar graphs look great as well. For documentation purposes, it might be a good idea to also include the starting and ending dates and times of the voting on each of those pages.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 16, 2024, 9:55pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/52 "2024-12-16T21:55:00Z")

</div>

> [@Quercus](#):
>
> For documentation purposes, it might be a good idea to also include the starting and ending dates and times of the voting on each of those pages.

Probably better to make UI suggestions directly to them, yes?

> [@tim.one](#):
>
> I reported that via the “Feedback” button (lower right of page).

---

<div class="post-metadata">

**Author:** ![Quercus](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/quercus/32/31483_2.png) [@Quercus](https://discuss.python.org/u/Quercus)\
**Post date:** [December 16, 2024, 10:07pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/53 "2024-12-16T22:07:38Z")

</div>

> [@tim.one](#):
>
> Probably better to make UI suggestions directly to them, yes?

Maybe, but rather than my sending a suggestion directly to them, it seemed preferable to either first allow an opportunity to form a consensus amongst us, or to allow Guido or you to make the decision. Too many cooks might spoil it.

Thanks for passing the suggestion on to them.

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [December 16, 2024, 10:50pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/54 "2024-12-16T22:50:25Z")

</div>

> [@Quercus](#):
>
> Thanks for passing the suggestion on to them.

To be clear, I didn’t pass on the suggestion. The piece I quoted was in response to @MegaIng, saying that I passed on his _bug_ observation: that the end time reported was current local time rather than the time the election ended.

My interest is in ensuring their service will be usable for us, and bugs are the only things I feel obligated to report to them. I’m not passing on others’ “UI improvements” that aren’t addressing clear errors.

It’s their project, and they have to balance “feature requests” across _all_ their users. To do that, they need to hear from users directly.

I’m not saying I disagree with your idea (I don’t), but am saying I’m not a “contact point” for their project. @ArendPeter is, and may - or may not - notice your suggestion when he browses this topic.

I personally don’t want to see this topic become like an Ideas topic, with a hundred people bike shedding UI ideas, nobody responsible for “doing something”, and probably never reaching consensus anyway 😉.

---

<div class="post-metadata">

**Author:** ![Quercus](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/quercus/32/31483_2.png) [@Quercus](https://discuss.python.org/u/Quercus)\
**Post date:** [December 16, 2024, 11:26pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/55 "2024-12-16T23:26:35Z")

</div>

> [@tim.one](#):
>
> The piece I quoted was in response to @MegaIng, saying that I passed on his _bug_ observation

Ah, I see.

> [@tim.one](#):
>
> … they need to hear from users directly.

OK, will send the feedback to them directly.

---

<div class="post-metadata">

**Author:** ![ArendPeter](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/arendpeter/32/24499_2.png) [@ArendPeter](https://discuss.python.org/u/ArendPeter)\
**Post date:** [December 17, 2024, 12:21am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/56 "2024-12-17T00:21:57Z")

</div>

Thanks! I got the feedback. It makes sense to me as well 🙂

But yes, although I will do my best to keep up with this thread, please don’t be shy about using the feedback button on the website. I’m happy to receive all feedback (UI improvements, bug reports, general suggestions, etc), and that’ll be the best way to ensure that it’s on my radar

---

<div class="post-metadata">

**Author:** ![guido](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/guido/32/21_2.png) [@guido](https://discuss.python.org/u/guido)\
**Post date:** [March 1, 2025, 4:40am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/57 "2025-03-01T04:40:49Z")

</div>

Waking up this topic, I believe we still don’t have an answer to my original question, which was, which tool to use, and (implicitly) also what do we tell Ee about how we want that tool to be used.

Have we settled on [Bettervoting.com](http://Bettervoting.com)? Which things do we require them to fix before we are happy with them? Do we ask [Bettervoting.com](http://Bettervoting.com) to run the election for us (at a fee, of course) or do we use their site to run it ourselves? (IIUC both options are open.)

Do we have a good understanding of the configuration we will need to use to satisfy all the requirements for the SC election set forth in PEP 13?

Is there still an option open to use @larry’s library? What would it take to host such an election, assuming Larry doesn’t want to be involved? (And as a core dev and voter, he probably shouldn’t be involved in running the election, other than by having written the code?) Or is this door closed?

---

<div class="post-metadata">

**Author:** ![tim.one](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/tim.one/32/282_2.png) [@tim.one](https://discuss.python.org/u/tim.one)\
**Post date:** [March 1, 2025, 6:34am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/58 "2025-03-01T06:34:07Z")

</div>

> [@guido](#):
>
> Waking up this topic, I believe we still don’t have an answer to my original question, which was, which tool to use, and (implicitly) also what do we tell Ee about how we want that tool to be used.

Using the STAR voting service is the only option that’s been seriously discussed here, and it’s been discussed a lot. I posted an exhaustive account for @EWDurbin of every step needed to configure the service for what we want.

> [@](#):
>
> Have we settled on [Bettervoting.com](http://Bettervoting.com)?

I have. Nobody else I recall has suggested anything else.

> [@](#):
>
> Which things do we require them to fix before we are happy with them?

I ran test elections here and the STAR folks already fixed every gripe we had. Crucial feedback still needed would have to come from @EWDurbin. who needs to do his own playing with the system…

> [@](#):
>
> Do we ask [Bettervoting.com](http://Bettervoting.com) to run the election for us (at a fee, of course) or do we use their site to run it ourselves? (IIUC both options are open.)

Not up to me. I assume @EWDurbin would run it. But If there are “enough” voters, the service will charge a fee even if we do run it ourselves (I understand that’s negotiable).

> [@](#):
>
> Do we have a good understanding of the configuration we will need to use to satisfy all the requirements for the SC election set forth in PEP 13?

I’ll leave that for you to answer, since you made the PEP changes. As I recall, the PEP is very light on “requirements”.

> [@](#):
>
> Is there still an option open to use @larry’s library?

I don’t believe there ever was, since @larry doesn’t want to run elections, and nobody else has volunteered to do so either.

In the background, we’re (the STAR folks, Larry, & I) still working on ensuring Larry’s library can be used to verity the precise results the STAR service claims. Anonymized ballots are already available for downloading when an election ends.

> [@](#):
>
> What would it take to host such an election, assuming Larry doesn’t want to be involved? (And as a core dev and voter, he probably shouldn’t be involved in running the election, other than by having written the code?) Or is this door closed?

Since it’s purely hypothetical, I don’t see value in speculating about it. Obviously, “we” would need to write our own app(s) to host the election. Nobody I’ve heard from has any interest in doing that.

---

<div class="post-metadata">

**Author:** ![larry](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/larry/32/936_2.png) [@larry](https://discuss.python.org/u/larry)\
**Post date:** [March 1, 2025, 10:42am UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/59 "2025-03-01T10:42:01Z")

</div>

To be clear, I declined to volunteer to create and run a new online voting service for the Python community because I’m not really a web guy, and I’m definitely not a system administrator. I suspect Guido asked me if I’d be interested in the job because I wrote the election tabulation library we’d want to use–not because I was a good candidate for the web & sysadmin work. (Which, I’m really not.)

---

<div class="post-metadata">

**Author:** ![guido](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/guido/32/21_2.png) [@guido](https://discuss.python.org/u/guido)\
**Post date:** [March 1, 2025, 4:23pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/60 "2025-03-01T16:23:57Z")

</div>

Okay, I will just let the SC know that this topic exists, for when they start thinking about organizing the next election.

---

<div class="post-metadata">

**Author:** ![barry](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/barry/32/42_2.png) [@barry](https://discuss.python.org/u/barry)\
**Post date:** [March 1, 2025, 4:58pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/61 "2025-03-01T16:58:08Z")

</div>

According to [PEP 13](https://peps.python.org/pep-0013/#electing-the-council), the “election process is managed by a returns officer nominated by the outgoing steering council.” Since the current SC will be the outgoing SC\[1\], I think it would be fine to [open a ticket on the SC tracker](https://github.com/python/steering-council/issues) now, so that this at least gets on the agenda early. I’d suggest including any open questions you’d want the SC to address.

* * *

1. barring recalls or resignations

---

<div class="post-metadata">

**Author:** ![smontanaro](https://sea2.discourse-cdn.com/flex002/user_avatar/discuss.python.org/smontanaro/32/1389_2.png) [@smontanaro](https://discuss.python.org/u/smontanaro)\
**Post date:** [March 1, 2025, 5:33pm UTC](https://discuss.python.org/t/finding-a-bloc-star-provider/73918/62 "2025-03-01T17:33:18Z")

</div>

Darn, not the next federal election?

[Previous page](https://discuss.python.org/t/finding-a-bloc-star-provider/73918.md?page=2)

[Next page](https://discuss.python.org/t/finding-a-bloc-star-provider/73918.md?page=4)
