The in-session progress bar reads session.cardsShown/cardsCorrect/cardsIncorrect, but the session store's answer() never refreshed the session object — the backend tracked the counters but the client kept the stale start values (all 0), so the bar appeared frozen. answer() now mirrors the backend's increment locally; end() still replaces with authoritative server totals. Adds an E2E regression test.