Draw problems from a saved practice list
Candidates can mark problems in the lobby and use "Pick from my list" to draw uniformly from that saved set, avoiding the current problem when another marked problem is available. The draw button and list status remain visible while the specific-problem picker is collapsed. The list is stored in this browser, without account or device synchronization.
Drawing from the list leaves difficulty and topic filters and a manually chosen duration unchanged. Later explicit filter changes follow the existing manual-selection rules: keep the selected problem when it still matches, or recommend another matching problem when it is excluded. Neither path edits the saved list. Returning through the browser's back/forward cache keeps any explicit problem choice visible, including a card selection, a list draw, and a history "Try again" selection.
Problem cards have separate selection buttons and labeled list checkboxes. Stored IDs are validated against the current bank, and changes synchronize between lobby tabs. Failed writes preserve unsaved changes for the current visit. An empty list disables the draw action with an explanation; if another tab empties the list while the draw button has keyboard focus, focus moves to the status before the button is disabled. The existing recommendation and general random-selection pools are unchanged.
Validation:
- 40 selected Chromium and unit regressions pass without skips, covering collapsed-picker access, cross-tab focus, subsequent filter changes, persistence, storage failures, retries, and interview navigation.
- The full local gate was run and did not pass. Its static browser suite reports 1,358 passed, 11 failed, and 16 skipped. Failures include unsupported C++20, Windows process tests, and the existing system-font height assertion (802px versus 800px). Other gates report missing Rust tools and Windows script/path failures; C/Java and several tooling checks are skipped. Live interviews remain unverified locally.
- ESLint, Prettier, generated-card drift checks, and Git hooks pass.
- Inspected 1280px, 375px, and 320px layouts with a saved list and the picker collapsed; there is no horizontal overflow. At 1280px the lobby height remains 802px with this Windows system font and 800px with Arial.
Closes #368
Summary by cubic
Adds a saved practice list to the lobby so candidates can mark problems with an "In my list" checkbox and draw the next one uniformly from that set, avoiding the current problem when another marked problem is available. The list persists in localStorage without account or device sync and stays in sync between lobby tabs; recommendation and general random selection keep their own pools and ignore the practice list.
The draw button and list status remain visible with the problem picker collapsed. A drawn problem can fall outside the difficulty or topic filters; draws keep a manually chosen duration and otherwise apply the drawn problem's suggested one, without rewriting filters or editing the saved list. Later filter changes follow the existing manual-selection rules, and back/forward restore keeps an explicit choice visible, whether picked by card, practice draw, or history's Try again.
Stored IDs are validated against the current problem bank; empty, malformed, or retired lists disable the draw, moving focus to the status when another tab empties the list while the button is focused. Failed or blocked localStorage keeps the list usable for the current visit with a "Kept for this visit only" note. Problem cards get separate selection buttons and labeled checkboxes.
Closes #368.