migrate interval trainer, new app icon
Created by: jedmund
Summary
- Rebuilds Interval Trainer on the shared exercise architecture from #26 —
ExerciseState+ScoringOverlay+PickerWidget, matching Interval Classifier's visual language (glass card, material picker, centered feedback with inline bold answer + semitones + note labels, capsule Next). - First exercise with procedural prompt generation.
ExerciseStatehandled it unchanged, confirming the state model is generation-agnostic. Streak-based interval unlocks preserved (silent, no toast); that bookkeeping stays local to the exercise. -
PickerWidgetgrid columns now adaptive (2 / 3 / 4 based on choice count) so the picker stays readable as intervals unlock. -
IntervalTrainerConfiggained acontextfield that was already in lesson JSON but being silently dropped. - New app icon (waveform on cream). Dark/tinted slots registered but unfilled, fall back to default. Build number bumped to 3.
Test plan
-
Standalone Interval Trainer: Exercises grid → tap → listen, pick, advance. After 3 correct, new intervals silently appear in the picker. Complete all 12, retry from completion resets dots. -
Lesson with Interval Trainer (music-theory week 1, 3-ex2): context text renders above card; progress survives navigation away and back; completion records an attempt and allows scrolling past the gate. -
App icon renders in Springboard and passes App Store Connect upload.