What changed, and why
Playtesters kept seeing the same names in the figure-suggestion list every turn, including people they had just messaged. The list never moved as a run went on, so it read as dead chrome instead of a live "who to reach next".
The fix is small because the data was already there. The picker already keeps a contacted list of everyone messaged this run; the suggestion list just never looked at it. This change derives the displayed suggestions by removing anyone already contacted, and adds a short note for the case where that empties the list. It is UI-only: no store action, API route, or AI prompt is touched.
The filter: suggestions become "who to try next"
contacted mirrors the store's record of every figure messaged this run. displaySuggestions now subtracts those names from its base list — the era-aware suggestions, or the famous-names fallback (LOCAL_DEFAULT) when the suggester returned nothing. A Set keeps the lookup cheap.
contacted (224) is the store's contacted-figures list; displaySuggestions (318) filters the base by it.
components/FigurePicker.vue · 554 lines
⋯ 223 lines hidden (lines 1–223)
⋯ 90 lines hidden (lines 225–314)
⋯ 232 lines hidden (lines 323–554)
When the list empties
Filtering can empty the list: contact every suggested figure and nothing is left. Rather than leave the section's header floating over nothing, a one-line note takes the list's place and points the player back to free typing (anyone is still reachable by name). It renders only when the filtered list is empty, and it lives in the branch that already excludes the loading-skeleton state, so it never shows while suggestions are still being fetched.
The note follows the suggestion buttons, gated on an empty displaySuggestions.
components/FigurePicker.vue · 554 lines
⋯ 192 lines hidden (lines 1–192)
⋯ 348 lines hidden (lines 207–554)
The tests
Two unit tests pin the behavior, mounting the real component against a seeded store. The first seeds a contacted figure matching one of two suggestions: it asserts that suggestion is gone, the other stays, and the contacted figure still shows in the contacts row. The second contacts the only suggestion and asserts the chips vanish and the exhausted note appears. Both are discriminating — they fail if the filter or the empty-state note regresses.
The two issue-#130 cases, appended to the existing FigurePicker spec.