Almost every alliance ends up building the same spreadsheet: names down one side, the date each person last conducted, plus 21 days, and a column working out who's up next. It works until it doesn't. This is what the rules should actually be, and the three things that quietly break the sheet.
A queue looks fairer and is worse. The moment three people are on holiday, a queue has to be rewritten by hand — and whoever rewrites it is now the person deciding who rides, which is exactly the suspicion you were trying to avoid.
A cooldown says only: once you've had a train, you can't have another for N days. Twenty-one is the common choice. Everyone past their cooldown is eligible, and the rota picks from that set. Nobody has to maintain an order.
Two decisions are worth making explicitly, because a sheet usually makes them by accident:
Among everyone eligible, a flat random pick is fair across a year and infuriating across a month: somebody rides twice while somebody else sits through three cycles. The fix is to weight the draw. The weight that works is time past the cooldown wall:
weight = max(1, days_waiting − cooldown_days + 1)
The subtraction is the whole point. Counting from the last ride compresses everything, because with a 21-day cooldown every eligible person is already at 21 or more. Counting past the wall spreads them out:
| Waited | Weight if you count from the last ride | Weight past the wall |
|---|---|---|
| 22 days | 22 | 2 |
| 25 days | 25 | 5 |
| 30 days | 30 | 10 |
| 45 days | 45 | 25 |
Counting from the last ride, someone who waited 45 days is barely twice as likely as someone who waited 22. Past the wall they're twelve times as likely — close to "whose turn is it", while still being a draw, so a single unlucky week doesn't become a grievance.
If a member buys an extra train, don't let it touch the rota. Charging them a cooldown means paying for a train costs you your place in the free rotation, and being gifted a VIP seat delays your own turn. Both are backwards. Record the run so the history is complete, then exclude it from the cooldown and from the waiting order.
Someone away for a fortnight shouldn't be picked, and shouldn't be punished for it either. What sheets usually do is delete the row — which also deletes their history. An excused window that ends on its own is the version that doesn't need remembering.
This is the one that does real damage, because it's invisible. A blank date sorts oddly, so those rows drift to the bottom and stop being read.
Here's a real example, from an alliance that had been running their rota by hand for four months. Their sheet had 97 members. Sixty-seven had a last-train date. Thirty had none — and the sheet's own "eligible now" figure quietly excluded all thirty, so nearly a third of the alliance was invisible to the thing deciding who rides. Nobody was being unfair on purpose. The spreadsheet just never asked about them.
A rota is only trusted if a member can be told why they weren't picked. That means keeping two things:
The related habit: if you re-roll a draw because you didn't like the result, that should be visible too. A rota where the officer can quietly re-roll until they get the name they wanted is not a rota.
The final test isn't fairness in the abstract — it's whether someone else could run it next week. Written down, the whole thing is four lines:
If your current answer to "who's next?" is a spreadsheet only one person understands, that's the thing worth fixing — whichever way you fix it.