- The zero-hearts check moved inside the answer transaction: two wrong
answers sent at once with one heart left were both accepted (reproduced
with two threads).
- Finishing a lesson or an island without hearts and without having
answered its questions is now 403 no_hearts; before, quiz/complete let
a student move on island after island with zero hearts. Losing the last
heart on the last question still finishes the island.
- A heart that came back while waiting is now saved before answering, so
the reply no longer says 0 hearts left (the app then showed the
no-hearts page to someone who had a heart).
- The 403 also carries fullRefillAt for the waiting screen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>