You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ExerciseProgressStore constructor now requires exercise_types: list[str] parameter
ExerciseProgressStore.increment() takes source_word_id: int instead of source_word: Word
ExerciseProgressStore.get_word_pairs_with_scores() no longer accepts exercise_types parameter (uses configured set)
ScoredWordPair model now includes source_word_id: int field
New Features
Per-exercise-type score tables: Exercise statistics are now stored in separate database tables per exercise type (e.g., user_word_exercise_scores_nl_ru_flashcard), improving isolation and making table ownership explicit
Cache-support APIs: New export_remote_snapshot() and apply_score_delta(event_id, ...) methods on ExerciseProgressStore for the planned database_cache module
Idempotent score replay: apply_score_delta uses event IDs to prevent double-application of remote score deltas
database_cache module documentation: Full PRD, architecture, and product brief for the upcoming local-first cache module
Bug Fixes
Fixed DatabaseService.add_words() to use the word's actual language attribute for table routing instead of always defaulting to the source language
Other Changes
CachedDatabaseService marked as legacy (superseded by planned database_cache)
NeonBackend exercise methods extracted to _neon_exercise.py to stay under 200-line limit
Updated README with database_cache recommendation and capabilities overview
sampling module updated to pass exercise_types to ExerciseProgressStore