The rule could not be saved because it failed validation.
errors is keyed by the request field that failed, and each value is a stable
i18n message code. msg carries the human-readable text for the same failure.
A rule must be exactly one of two shapes — a legacy VM-to-VM rule that lists
servers, or a combined VM-to-Host rule that references both a vmGroup and
a hostGroup. Sending both shapes, or only one half of a combined rule, is
rejected here. The same mutual exclusion is enforced a second time at the
domain layer under the code affinityGroup.ruleShape.invalid.