Dev note · contract addition
The bar has to advance, and LessonSummary carries only the value it arrives at: stepsDone/stepCount, no previous. Add stepsDoneBefore: int (the goal's completed-step count as it stood when the run started, server-computed with the rest of the summary). Deriving it as stepsDone - 1 is wrong twice: a replayed step advances nothing, and a run that completed no step must draw a bar that does not move rather than one that silently rewinds.
Sound · no chime on this beat
The sequence's one primary chime was already spent (green triad on an all-clear beat 1, otherwise the neutral voice signature on beat 2). Here: a single soft haptic as the bar comes to rest, and nothing audible. A tone on every beat is what makes all of them worthless.