Deserialization happens in responseToResult via response.body<T>() on the 2xx branch. That call was outside safeCall's try/catch, so a malformed 2xx body threw an uncaught SerializationException (crash) instead of mapping to DataError.Network.SERIALIZATION. Move responseToResult(execute()) inside the try so both transport and parse errors are typed. Found by the milestone review.