The 20th Annual
Francis Davis Jazz Critics Poll:
2025 Mid-Year

Admin Notes

The idea here is to provide a lot of specific detail on how the website is set up, how the software works, and any other information that one needs to know to keep it working and/or to set up future polls. Work on this was cut short of time. It probably needs to be redesigned from scratch (perhaps as part of a complete overhaul of the website).

Setting Up the Website

The top-level website directory is, as it has been since 2014, at https://hullworks.net/jazzpoll/. At some point it should be moved under its own domain name. Underneath it are directories with names like 24/, for the 2024 year-end poll, and 24my/ for the 2024 mid-year poll. So the first thing to do is to create a new 25my directory. Then, add a link from the top-level index page to the new directory, and add an entry in the Makefile to make an archive of the new directory. There is one such entry for each previous poll, so copy one and edit the year. The website is designed to be updated year-by-year -- rather than as a whole -- so there is also a top-level make entry.

After that, the easiest way to get started is to copy all of the files from 24my into 25my. I would normally use the previous year's files, as they were more recent than the previous mid-year's files, but I figured I'd want to keep more of the specific mid-year edits than the year-end ones. The one exception here was the critics file. I wanted to use the latest critics list, so I copied it over the one from 24my/.

After that, a bunch of changes need to be made. There's an old text file called HOWTO that explains the necessary year-to-year changes, so I started by consulting it. But I also figure I need to carefully re-read everything, and make extra edits for clarity. This is a record of my edits (superseding HOWTO, which I will also edit with an eye to future years).

Here's a detailed list of file edits. Anything marked TBD needs to be checked and edited as necessary.

Voter List

By far, the hardest part of administering the poll is voter list management: qualifying voters, managing mailing lists, sending out invites and notices, trying to figure out who to nag and/or accept late votes from. Actually counting the ballots and compiling the results is relatively easy (almost a pleasure). Still, a big part of the gratification that comes with the poll is interacting with the voters, who I've developed immense respect and appreciation for.

I manage the voter list in a non-public file voter-log. This maps onto an email list managed by my local Thunderbird mailer, and onto an email list on my server, jazzpoll@hullworks.net. (The server has a second email list for administrators/helpers: jpadmin@hullworks.net. (There is also a spreadsheet that Paul Medrano set up, which is useful for sharing information in the jpadmin list, but I'm restarting with voter-log. To update these lists, I did the following:

  1. I started with the 2024 (not 2024my) file, and commented out all the entries. Each entry is a call to a PHP function, which explodes a text string and prints out a table entry. The string has fields [0 .. 7], which I slightly adjusted. The fields tell me: name and credits, whether voted in 2024 (or -N for number of years lapsed since last vote), mailing list(s), invite sent (and how)?, invite ack?, ballot received.
  2. I looked at the 2024 critics and uncommented and marked everyone on the list who had voted in 2024. Anyone else will have their lapsed times incremented.
  3. I looked at the jazzpoll membership list, and noted it for everyone who was subscribed. I also noted several subscribers who had died, and unsubscribed them. (Most notably Francis Davis, but there were some who had died in previous years.)
  4. I looked at the jpadmin membership list, and noted it for everyone who was subscribed. This wasn't necessary for the task at hand, but is useful information. (This includes a few people who have never voted but are interested parties or at least personal gurus.)
  5. I went through my mail to flag voters who acknowledged receipt, and noted whether they intended to vote.
  6. I checked my mail from the previous jazzpoll mailing to identify bounces. I dropped those names from the list (two were RIP; I tried contacting Marcela Breton via JJA message).
  7. I looked at my Thunderbird Jazzpoll email list, noting names and collecting info for names not in server Jazzpoll list. This yielded an additional 84 critics names, of which 34 had voted in 2024 (and should be added to the Jazzpoll list, as they had not yet received invitations).
  8. In retrospect, I erred in starting with the 2024 year-end voter-log file. It had been greatly expanded, especially with the addition of international critics. I then had to reconcile the files. I divided the additions into three groups: 2024 voters; people who had been invited in 2024 but who didn't vote; and other names, briefly considered but uninvited. The first two should get personalized invites ASAP.
  9. Once the Thunderbird mailing list has been updated, create a template file, with: To: field set to "{{DisplayName}} <{{PrimaryEmail}}>"; Subject: "Francis Davis Jazz Critics Poll: Mid-Year 2025 Invite"; first text line: "Dear {{DisplayName}},". Save the template. Click on MailMerge, and specify: Address Book: Jazzpoll; Delivery Mode: Save as Draft. Click on Send, then Start. MailMerge then created 287 messages in 38 seconds. They are now in the Thunderbird Drafts directory.

What is mkball.sh and how does it work?

It is a shell/awk script, which is run by make to create the ballots and totals files. The documentation below was written to help understand where a bug is coming from, but it will be helpful if the program has to later be modified (or further debugged).

Its input files are:

Its output files are:

The main awk loop reads lines from ballots-in. Each non-blank, non-comment line begins with a record type code { C, M, M=, R, R=, N }. (The code also allows for V, D, and L, but these are unused in the Mid-Year Poll.) The code switches on record type:

The code also allows for { V, D, L } cases, but these are unused. It also allows for record types M! and R! for cases where there is no vote in a category. (Are these necessary?)

When the awk script finishes turning ballots-in into b.tmp, the END code writes out the various totals files.

After the initial awk script has created the file b.tmp,