A player who had already finished one Daily Challenge attempt today could start a second, get partway through it, switch tabs, and come back to find the first attempt's recap staring back, the live board nowhere on screen. It never happened on the day's first game. The two facts together were the whole clue: something in the page's tab-refocus logic was reaching for a result that only existed once an attempt had actually finished, and finding one left over from earlier the same day.

[An earlier fix](/posts/silence-was-two-different-bugs#the-request-that-never-happened) had already closed a sibling race in the same function: a tab refocus used to be able to silently restart a game that had *just* finished, before the completion effect got a chance to save it. That fix made a finished game for today's challenge authoritative on its own, so a restart could never win the race again. What it never had to consider is a second attempt: replaying the Daily Challenge shipped as a feature only after that guard was written, so nothing about it had ever been checked against the replay case.

Two independent investigations, run in parallel before anything was changed, landed on the same missing condition: the code that decides whether to show a finished-day recap checked whether the challenge had rolled over to a new day, but never checked whether a live game for *today's* challenge happened to be running right now.

```typescript
const storedResult = getTodaysResult(challenge!.challengeId);
if (storedResult !== null && !hasOngoingOldDaily) {
  alreadyPlayedResult = storedResult;
  // ...
  return;
}
```

`hasOngoingOldDaily` only fires across a day boundary. A second attempt started after the first one finished has neither condition working in its favor: the stored result from attempt one is sitting right there, and the game is for today, not yesterday, so the recap wins every time a tab refocus re-runs this check mid-replay.

The scale of the fix didn't match the effort spent deciding how to approach it. Rather than patch the condition inline, the change went through a short planning pass first, worth doing even for something this contained. That pass decided two things beyond the fix itself: since nothing about the shape of the change was still genuinely open, the plan would carry its own implementation instead of handing off to a separate session, and an audit of every other place the page reads a stored result would happen in the same pass rather than being deferred. A sibling pure function joined the one the earlier fix had already extracted, this one answering whether a live game for today is already running rather than whether a finished one should restart. The audit came back clean; none of the other call sites had the same gap.

Verifying it meant reproducing the exact failure in a live browser: seed a finished result for today directly in storage, load the page, confirm the recap shows correctly, start a replay, confirm the live board takes over, then fire the tab-refocus event by hand and watch which one stayed on screen. The live board did.