Protocol.request() deserializes the result using content-based polymorphic deserialization (selectClientResultDeserializer / selectServerResultDeserializer), which picks a concrete type based on JSON structure. The result is then cast to the caller's expected type via as T.
This is particularly problematic for:
GetTaskPayloadResult
GetTaskResult
related #566