The [detail tooltip pattern](/posts/detail-tooltips#explanation-on-demand) that let a player tap a chip in the game log to see what a fruit was worth and what spawned it had never reached the fruit sitting on the board itself, the thing the chip was actually describing. The fix applies in Daily, AI Duel, and PvP alike, since a tap explaining what's already on screen is help on demand rather than an assist that could change how anyone plays, the same distinction that's kept the word preview feature PvE-only.

Each board fruit's cell became a real button, gated on a new `animating` flag threaded down from each mode's own phase so a tap mid-resolution can't fire against a position that's about to change. The board itself stays hidden from assistive technology, and tap targets stay their current size. Both were the spec's own deliberate exclusions, not oversights, tracked as their own separate issues rather than folded into this one.

The larger piece was underneath the fruit tooltip rather than in it: "only one tooltip open on the page at a time" had only ever been true within the game log, enforced by state that lived inside `GameLog.svelte` itself. Making the board share that rule meant lifting it out into its own store, keyed loosely enough that neither caller needs to know how the other identifies its own content:

```typescript
isOpen(key: unknown): boolean {
  return _key !== null && _key === key;
},
toggle(key: unknown, content: DetailTooltipContent, anchor: HTMLElement) {
  if (_key === key) {
    this.close();
  } else {
    _key = key;
    _content = content;
    _anchorEl = anchor;
  }
}
```

A log chip identifies itself by the log entry object, stable because entries are append-only and never replaced. A board fruit identifies itself by its edible's `id` string instead, since the whole edibles map gets replaced wholesale on every state update and object references don't survive that. A third caller turned up mid-implementation with the same problem in miniature: the lives-count explainer already had its own fully independent tooltip state, rendered twice for two stat-bar instances that would otherwise have been able to show two tooltips at once, and it moved onto the shared store for the same reason the board did.

A review pass caught two real regressions the migration had introduced: the lives explainer's old dismiss-on-scroll behavior had gone missing, restored centrally in the one component now responsible for dismissal everywhere, and the new fruit buttons had no `tabindex="-1"`, which would have made every fruit on the board a real keyboard tab stop despite sitting behind an `aria-hidden` ancestor, exactly the trap `WordInput` and the nav-confirm dialog already knew to guard against.