diff --git a/TODO.md b/TODO.md
index 825512e..6f319ed 100644
--- a/TODO.md
+++ b/TODO.md
@@ -3,10 +3,6 @@
- [ ] **Player kicking.** Admins should be able to kick players out of the game so that it doesn't get stuck if a player vanishes. Admins can kick other admins. A kicked player's cards go to the discard.
-## Minor Gameplay Polish
-
-- [ ] **Dead Pi-Rat rank voting streamlined**. Don't allow voting for dead Pi-Rats. If a player's only vote options are dead, then they skip voting entirely.
-
## Words Words Words
- [ ] **Example Play formatting.** The Example Play section of the Rules page could use a bit more formatting for legibility. Make diagrams of the card state at each step rather than just a text listing.
diff --git a/frontend/src/components/UpkeepPhase.svelte b/frontend/src/components/UpkeepPhase.svelte
index 477b4d1..bd6a1d5 100644
--- a/frontend/src/components/UpkeepPhase.svelte
+++ b/frontend/src/components/UpkeepPhase.svelte
@@ -14,6 +14,19 @@
// Helpers
$: hand = state.player.hand_cards ? JSON.parse(state.player.hand_cards) : [];
+ // A nominee must be another living, in-play Pi-Rat: not the voter, not a
+ // previous-scene Deep, and not dead / awaiting-recruit (they'd reset to
+ // Rank 1 anyway). Mirrors crud_upkeep.is_eligible_nominee.
+ function eligibleNomineesFor(voter) {
+ return state.players.filter(p =>
+ p.id !== voter.id && p.role !== 'deep' && !p.is_dead && !p.needs_reroll
+ );
+ }
+ $: myNominees = eligibleNomineesFor(state.player);
+ $: hasVoted = !!state.votes.find(v => v.voter_player_id === state.player.id);
+ // With no eligible crewmates, the voter skips voting entirely (no deadlock).
+ $: mustVote = myNominees.length > 0;
+
// Drag & Drop State
let keepCards = [];
let discardCards = [];
@@ -191,19 +204,21 @@
✔️ Voting complete! Results tallied.
- {:else if state.votes.find(v => v.voter_player_id === state.player.id)}
+ {:else if hasVoted}
✔️ Vote submitted! Waiting for other players to submit their nominations.
+ {:else if !mustVote}
+
+
No living crewmates left to nominate — you skip voting this round. Go ahead and ready up.