Dev note · contract + selection rule
Selection is derivable today: lessonScorePercent == null → omit beat 1; stepsDone == stepsDoneBefore → omit the goal beat, which leaves this beat as the final surface. Both need stepsDoneBefore (see complete-progress.html) and the attemptId/durationMs playback handles (see complete-voice.html). Nothing else. The "didn't spend a lesson" line is a metering claim and must be served, not assumed — the wall's own state (lessonsRemaining unchanged by this run) is what licenses it; if the server did spend a lesson, the line must not print.
Sound · the neutral signature, and never an error tone
The neutral voice-received signature (to be designed) plays here exactly as on any other voice beat — the learner spoke, and this beat is grade-blind. No failure tone, no wrong-answer tone: the standing silence rule holds, and a sad sound over a scorer outage would tell the learner their voice was the problem.