Skip to content
This repository has been archived by the owner on Nov 11, 2024. It is now read-only.

Commit

Permalink
Final cleanup before archival
Browse files Browse the repository at this point in the history
Done together in an EC meeting with @7c6f434c, @Lassulus, @edef and
@ryantrinkle
  • Loading branch information
infinisil committed Nov 11, 2024
1 parent 36663ba commit 3444033
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 151 deletions.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
> [!Note]
> We're having data corruption problems with the election platform, see [the announcement](https://discourse.nixos.org/t/nix-steering-committee-election-2024/52232/15)
> This repository is archived because the election [has concluded](https://discourse.nixos.org/t/results-for-the-nix-steering-committee-election-2024/55511).
> For help with running another election, check out the [EC documentation](./ec/README.md) or contact this elections EC members.
# Nix Steering Committee (SC) Election 2024

Expand Down Expand Up @@ -50,7 +51,7 @@ Its primary mission is to ensure legitimacy of the election.

For any questions, concerns or suggestions about this election, reach out to the election committee:
- On GitHub: Ping [@NixOS/ec-2024](https://github.com/orgs/NixOS/teams/ec-2024)
- By email: <[email protected]>
- <s>By email: <[email protected]></s>
- On Matrix: [Nix SC Elections](https://matrix.to/#/#sc-elections:nixos.org) room
- To any specific member as mentioned below

Expand All @@ -66,7 +67,7 @@ For this first election, the NCA members are acting as the EC:

## Timeline

The election is expected to take place in a span of 6 weeks:
The election was originally expected to take place in a span of 6 weeks, but has stretched out some more:

- 2024-09-16 Mon: Election starts
- 2024-09-29 Sun: Deadline for nominations
Expand Down
51 changes: 0 additions & 51 deletions ec/CIVS.md
Original file line number Diff line number Diff line change
@@ -1,51 +0,0 @@
This is a very drafty doc!

Ballots should have names plus the CoI identifier/category/pairwise disqualification tag, something like that

Description should point out the CoI thing, that the result of the election might not be correct just yet

Marker to clarify CoIs. Depends on CoI graph

All CSS gets removed, pictures get fetched and inlined

```html
<a href="https://github.com/NixOS/SC-election-2024/blob/main/candidates/aleksanaa.md">@aleksanaa</a>
<a href="https://github.com/NixOS/SC-election-2024/blob/main/candidates/hsjobeki.md">@hsjobeki</a> (conflicts with @asymmetric)
<a href="https://github.com/NixOS/SC-election-2024/blob/main/candidates/asymmetric.md">@asymmetric</a> (conflicts with @hsjobeki)
<a href="https://github.com/NixOS/SC-election-2024/blob/main/candidates/SigmaSquadron.md">@SigmaSquadron</a>
```

With profile pics (confirmed this works pretty well)
```html
<img src="https://avatars.githubusercontent.com/u/101816" width="25" height="25"> asymmetric (<a href="https://github.com">candidate info</a>)
<img src="https://avatars.githubusercontent.com/u/20525370" width="25" height="25"> infinisil (<a href="https://github.com">candidate info</a>)
```

- Name of supervisor (you): Nix Election Committee
- E-mail address of supervisor: [email protected]
- Day and time you plan to stop the poll: <FILLME> 23:59:59 UTC-12

```
Click on names to see each candidates public statements, conflicts of interest and filled out questions.
<br>
The winners are taken post CoI evaluation. That means, if 2 winners with a CoI would be winning an election, only the person with more votes gets into the EC, though it's not trivial to see who actually wins in such a case. The EC will announce the final result when the CoI evaluation is done.
<br>
The final results in case of conflicts of interest will be available a few days after the poll is ended, at <a href="something">this link</a>
```

- Enable detailed ballot reporting: Yes (needed for the CoI calculations)
- Enforce proportional representation [more information]: Yes
- rank of their favorite choice
- Create the poll
- Start it from the link you received in the email
- Build `nix-build -A voters`
- Upload `result/emails.txt` as the voter list
- Download the CSV table of voters that haven't activated their email yet
- TODO: Run a script to send all of those users a reminder to active to be able to vote


## To evaluate results

- Look at "Winning set(s) of choices" for the winners, there might be ties which can be resolved by looking at "Choices (in individual preference order)", I think
- If there's CoI conflicts in the winning set, click "Show details" and "Download ballots in CSV format"
- Remove the candidate with the least votes from the ballots and create a new test poll with the changed ballots
194 changes: 103 additions & 91 deletions ec/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# How to be the EC

This document gives more-or-less complete docs on how the first EC ran this election.

## Ahead-of-time preparations

### For a GitHub org owner
Expand All @@ -22,7 +24,8 @@
- Generate a private key for the App and set it as a new repository secret named `PRIVATE_KEY`

### For the admins of the `nixos.org` mailserver
- Set up `[email protected]` as an alias for the EC members addresses
- Set up `[email protected]` as an alias for the EC members addresses.
Could also be `election<YEAR>@nixos.org` going forward.
- Send the mail server, SMTP user and password to the EC members, potentially regenerating the password to revoke access to previous EC members
- Make sure that you have a good enough email setup for sending many emails

Expand Down Expand Up @@ -52,8 +55,9 @@

**Important:** Before pushing, empty `voters.json` to prevent automation from inviting all those users already

- Remove or empty `scripts/invited.txt`
- Remove `usersWithoutEmailAndGitHub.txt`
- Remove or empty `scripts/invited.txt` and `scripts/endorsersAsked.txt`
- Remove `removed-voters-due-to-bounced-emails.json`
- Remove `opavote_ballots.blt` and `civs_ballots.csv`
- Empty `candidates`
- Ensure the repo reflects the current version of the Nix Governance Constitution
- Check that the voting platform is still functional and find an alternative otherwise
Expand Down Expand Up @@ -85,152 +89,160 @@
- Enable notifications for the public Matrix room
- Subscribe to all activity on the election repository

## Kick-off
- Update the blocked users list:
Get the GitHub ids using
```
gh api /orgs/NixOS/blocks --jq '.[].id'
```
## Announcements

Then Insert them into [`config.nix`](../nix/config.nix).
The [`ec/default.nix`](./default.nix) file contains code to automate announcements, able to take care of:
- Sending hundreds of personalised emails to voters.
- Ensuring proper formatting on GitHub and Discourse (where single newlines cause line breaks).
- Ease linking to repository files.
- Customise announcements based on the platform.

Don't update this once the voters are generated.
- Generate `voters.json` using
```
nix-build -A generateVoters
./result
```
- Announce it to discourse:
In general the workflow is always:
- Announce on Discourse with (`$NAME` is the name of the announcement, use auto-complete):
```
nix-build ec -A kickoff.discourse
nix-build ec -A $NAME.discourse
```

Then post the contents of `result` to Discourse
- Announce it on the website, linking to discourse:
Then post the contents of `result` to Discourse, potentially as a reply to a previous announcement.
- For more important announcements, post it to the website, linking to Discourse, with:
```
nix-build ec -A kickoff.website --argstr discourseLink $DISCOURSE_LINK
nix-build ec -A $NAME.website --argstr discourseLink $DISCOURSE_LINK
```

Then make a PR against [the website announcements](https://github.com/NixOS/nixos-homepage/tree/main/src/content/blog/announcements) and ping somebody from the marketing team to merge it.
- Push the generated `voters.json` to start triggering team additions
- Send the emails (needs `SMTP_PASSWORD` set):
Then make a PR against [the website announcements](https://github.com/NixOS/nixos-homepage/tree/main/src/content/blog/announcements), ensuring that CI passes and ping somebody from the marketing team to merge it.
- Send emails to voters (needs `SMTP_PASSWORD` set):
```
nix-build ec -A kickoff.email --argstr discourseLink $DISCOURSE_LINK
nix-build ec -A $NAME.email --argstr discourseLink $DISCOURSE_LINK
./result
```

If any fail to send, resume using
If 10 emails fail to send, it stops, but it can be resumed with
```
./result --resume
```

You can view failed sends in `jobs.log`, but you might also get mail delivery failure responses.
- Announce it on GitHub:
You can view failed sends in `jobs.log`, but you might also get delayed (up to ~1 day) mail delivery failure responses.

Wait until both:
- All automatically eligible voters have been invited to the team
- All emails are sent
Reach out to people whose email bounced by pinging them on GitHub and optionally removing their email from the `voters.json` file.

- Announce it on GitHub:
```
nix-build ec -A kickoff.github --argstr discourseLink $DISCOURSE_LINK
nix-build ec -A $NAME.github --argstr discourseLink $DISCOURSE_LINK
```

Then post `./result` as a PR to the election repo,
requesting a review from the voters GitHub team.
Then post `./result` as a PR (or a reply to an existing PR) to the election repo,
requesting a review from the voters GitHub team (which will ask you to explicitly confirm to send a notification to so many users).

Lock the PR to only collaborators (with write access),
so that only the EC can send further notifications using it.

Then, remove the teams review request again, so that it doesn't stick around in users "to review" column without being able to review it (since it's locked)

- Directly contact the users in `usersWithoutEmailAndGitHub.txt`

## Pre-voting phase

- See [this process](./process.md)

## 2024-09-27 Fri: Nomination reminder

Before the weekend with the nomination deadline, send a reminder:

- On discourse:
## Kick-off
- Update the blocked users list:
Have an org admin get the GitHub ids using
```
nix-build ec -A reminder1.discourse
gh api /orgs/NixOS/blocks --jq '.[].id'
```

Then post the contents of `result` to Discourse
in the same thread as the original kickoff announcement.
- On GitHub:

```
nix-build ec -A reminder1.github --argstr discourseLink $DISCOURSE_LINK
```
Then Insert them into [`config.nix`](../nix/config.nix).

Then post `./result` into the same PR as the original announcement.
- Via email (needs `SMTP_PASSWORD` set):
Don't update this once the voters are generated.
- Generate `voters.json` using
```
nix-build ec -A reminder1.email --argstr discourseLink $DISCOURSE_LINK
nix-build -A generateVoters
./result
```
- [Announce](#announcements) it, `$NAME` is `kickoff`
- Push the generated `voters.json` to start triggering team additions
- Directly contact the users in `usersWithoutEmailAndGitHub.txt`

If any fail to send, resume using
```
./result --resume
```
## Pre-voting phase

Process EC requests as documented in [`process.md`](./process.md) and keep the [timeline](../README.md#timeline) in mind throughout and send reminders throughout as described below.

You can view failed sends in `jobs.log`, but you might also get mail delivery failure responses.
### 2024-09-27 Fri: Nomination reminder

## 2024-09-30 Mon: Reminder for nominees
The weekend before the nomination deadline, do [the announcement](#announcements) with `$NAME` as `reminder1`.

### 2024-09-30 Mon: Reminder for nominees
- Open an issue [like this](https://github.com/NixOS/SC-election-2024/issues/103)
- Send emails to unconfirmed candidates using e.g.
```
nix-build ec -A unconfirmed.needsToSubmitFormAndNeedsMoreEndorsements
./result $GITHUB_HANDLE $NOMINATION_PR
```
- Send emails to unconfirmed candidates using the various attributes under `unconfirmed`:
```
nix-build ec -A unconfirmed.needsToAccept
./result $GITHUB_HANDLE $NOMINATION_PR
nix-build ec -A unconfirmed.needsToSubmitFormAndNeedsMoreEndorsements
./result $GITHUB_HANDLE $NOMINATION_PR
nix-build ec -A unconfirmed.needsToSubmitForm
./result $GITHUB_HANDLE $NOMINATION_PR
nix-build ec -A unconfirmed.needsMoreEndorsements
./result $GITHUB_HANDLE $NOMINATION_PR
```
- Optionally PM the nominees via other means (e.g. Matrix) in case the above means fail.

## 2024-10-02 Wed: Candidate finalisation and reminder
### 2024-10-02 Wed: Candidate finalisation and reminder

- Close all PRs of candidates that didn't meet the criteria
with a comment mentioning the unmet criteria.

- Decide with the EC on which (if any) candidates have a conflict of interest
and update the source for `reminder2` with the result.

- Copy all candidate forms for confirmed candidates from the internal EC repo into this repo, the
- Copy all candidate forms for confirmed candidates from the internal EC repo into this repo.

- Delete the internal EC repo.

- Send a reminder for the Q&A, updating voter emails and requesting exceptions:
- Send a reminder for the Q&A, updating voter emails and requesting exceptions, by doing an [announcement](#announcements) with `$NAME` as `reminder2`.

- On discourse:
```
nix-build ec -A reminder2.discourse
```
## Voting phase

Then post the contents of `result` to Discourse
in the same thread as the original kickoff announcement.
- On GitHub:
- Push Q&A to candidate forms using [this script](./collect-questions.sh).
- Start an OpaVote election with:
- Description:
```markdown
In this election we choose 7 people for the first Nix Steering Committee. See the announcement for more information.

```
nix-build ec -A reminder2.github
```
You must cast your vote by 2024-11-03 23:59:59 Sun in Anywhere on Earth time, meaning as long as it is still the given day anywhere on the planet (i.e. at the end of that day in UTC-12). After the poll is closed, votes will not be accepted for any reason.

Then post `./result` into the same PR as the original announcement.
Please inform yourself about the candidates by looking at their candidate info documents, which include:
- Basic contact info
- A conflict of interest disclosure
- A statement on their motivation to be on the Steering Committee
- All Q&A questions answered by the candidate, followed by ones not answered

## Starting the voting phase
If you have a question, please contact the Election Committee.

- Push Q&A to candidate forms
- Add the voters via CIVS
- Send the announcement
- Archive the repo
TODO: Token timeout
```
- Enable automatic reminders (note that you can update the reminder text over time).
- If you intend to use OpaVote to tally the results, pick an appropriate method and number of winners, otherwise pick any method and the same number of winners as candidates.
- Add all the voters by building `nix-build -A voters` and uploading `result/emails.txt`.
- Send the [announcement](#announcements) with `$NAME` as (`voteStart`, `corruption`, `restart`)
- Turn off the [Auto-merge update email PR workflow](../.github/workflows/update-email.yml), because EC members will need to manually add emails to OpaVote when merging a PR from now on.

## Post-voting phase
### Final voting reminder

## Misc
Send a final voting reminder like [this](https://github.com/NixOS/SC-election-2024/pull/85#issuecomment-2453158340) to voters using GitHub and Discourse.

- Running CIVS
## Post-voting phase

Sending reminders:
- 2024-10-17 Friday: (vote reminder)
- Close the OpaVote poll and download the ballots, storing them under [`opavote_ballots.blt`](../opavote_ballots.blt).
- Run `nix-build -A verifyBallotMatch` to generate `result/civs_ballots.txt`
- Create a new CIVS poll, making sure to check:
- [x] Make this a test poll: read all votes from a file.
- [x] Enable detailed ballot reporting"
- [x] Enforce proportional representation (rank of their favorite choice)
- Close the CIVS poll to get the result
- Download the CIVS ballots from `https://civs1.civs.us/cgi-bin/download_ballots.pl?id=$POLL_ID`, store it in the repo as `civs_ballots.csv`
- Update the verification docs [here](../doc/verify.md).
- Post the [announcement](#announcements) with `$NAME` as `result`.
- Do final cleanups of this repository and archive it.

### In case of CoIs among candidates

The 2024 election didn't have any CoIs among candidates, but if future elections do, here's some notes:
- Next to the candidate names, indicate other people they conflict with.
When looking at election results, this allows voters to easily spot when two conflicting people would be elected and know that one of them will be disqualified.
- The description of the election should point out that the result of the election might not be correct depending on the conflicts.
- Remove the candidate with the least votes from the CIVS ballots and create a new test poll with the changed ballots
- Note that OpaVote also charges for recounts of ballots
8 changes: 4 additions & 4 deletions ec/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,7 @@ in
user=$(gh api "/users/$handle")
handle=$(jq -r .login <<< "$user")
id=$(jq -r .id <<< "$user")
echo "<img src=\"https://avatars.githubusercontent.com/u/$id\" width=\"25\" height=\"25\"> $handle (<a href=\"${repo}/blob/main/candidates/$file\">candidate info</a>)"
echo "$handle"
done
'';
};
Expand Down Expand Up @@ -621,8 +621,8 @@ in
announcement =
platform: loginExists: discourseLink:
''
After successfully tallying the 450 ballots cast (56% turnout) using CIVS,
We are hereby concluding this election!
After successfully using CIVS to tally the 450 ballots cast (56% turnout) on OpaVote,
we are hereby concluding this election!
We congratulate the first members of the Nix Steering Committee (SC) (ordered alphabetically):
- [@Ericson2314] (2 year term)
- [@fpletz] (1 year term)
Expand Down Expand Up @@ -658,7 +658,7 @@ in
We are now establishing communications with the first SC members
and will soon make a final handover announcement on behalf of the EC / NCA.
We, the members of the EC / NCA, and @ron from the NixOS Foundation board,
We, the members of the EC / NCA, and ${{ discourse = "@ron"; github = "@refroni"; }.${platform} or "Ron"} from the NixOS Foundation board,
are thankful for everybody's participation in this first election,
and are looking forward to see the first SC getting started.
Expand Down
1 change: 1 addition & 0 deletions ec/process.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ When replying to emails, make sure it's sent to all of:
```
- For all PRs the endorser was involved with (search for `involves:someUser`) that have at least 3 endorsements on the PR,
initiate the [decision process](#decision-process) to decide over whether there are enough non-conflicting endorsements.
You can also use [this script](./summarise-endorsers.sh) to automate this process more.
- If approved, add the "enough endorsements" label
- If approved and the nominee submitted the candidate template form, merge the PR and leave this comment:
```
Expand Down
Loading

0 comments on commit 3444033

Please sign in to comment.