5c0fc8ee2d
Vocab Flashcards / Multiple Choice were a flat linear walk through a
shuffled list — rating a card "Hard" or "Again" did nothing to bring it
back. Replaced with a real two-layer SRS, matching how Anki separates
in-session learning steps from the long-term schedule.
VocabSessionQueue (new) — the in-session layer. Position-based learning
steps:
- Again → card reappears 5–8 cards later (state: learning)
- Hard → reappears 7–10 cards later (state: learning)
- Good → first time: → review state, reappears 16–24 cards later
already in review: graduates, leaves the session
- Easy → graduates immediately
A card you keep failing keeps cycling until you mark it Good twice or
Easy once. answer() returns a ReviewQuality only on graduation — that's
the single rating handed to the long-term VerbReviewStore, so
intermediate Again/Hard presses no longer thrash the cross-session
SM-2 schedule.
VocabVerbPool.sessionVerbs (rewritten) — due-first ordering + a 20-card
session cap. Overdue verbs (per VerbReviewCard.dueDate) come first,
most-overdue leading; then never-reviewed verbs by frequency rank.
Not-yet-due verbs are intentionally skipped — that's the SRS schedule
doing its job. A single sitting is now bounded instead of a 100+ card
slog.
Study Again — the completion screen gets a "Study Again" button that
rebuilds the queue from the same verb set (re-shuffled), so you can run
the whole set again after finishing.
Progress display switched from "1 of 110" to "N learned · M to go",
which reflects the live queue as cards requeue and graduate.
Both vocab views now share VocabSessionQueue + VocabVerbPool; the queue
struct is pure value-type logic, easy to reason about and test.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>