The debounced observer was unreliable: drop(1) plus the ViewModel lifecycle could swallow a change after re-entering the app, so a single range change sometimes didn't refresh the widget. Refresh directly from the settings setters instead (always fires on a real change), serialized through a mutex so a rapid flip-and-flip-back can't run two updateAll calls at once and strand the widget on the intermediate value. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>