Fixed
- WebSocket score frames parsed as all-None. The wire nests the score object — a frame is
{"type": "score", "match_id": N, "score": {sets, games, points, server, is_tiebreak, timestamp, win_probability_p1?, danger?}}with the ULTRA model fields inside the score object — butScoreUpdate.from_dictbuilt itsScorefrom the whole frame. On real frames every field ofupdate.scorecame backNone. The nested object is now parsed when present; the inline read remains only as a defensive fallback for flat emitters.break_point/break_point_resultframes are flat on the wire and were never affected.
If you consume the live feed on 1.3.0, upgrade.