A definition stored with a legacy icon (e.g. mdi:tooth) reads back as
lucide:mdi:tooth, which the API's strict validate_icon rejects, so any
edit that echoed the icon back failed. Mirror the keepsAssignees
pattern: keep the loaded icon and delete `icon` from the PATCH body
while the draft icon is unchanged. The edit route dumps the body with
exclude_unset, so an absent icon leaves the stored value untouched;
a new choice is sent and No icon still sends null. Create always
sends icon.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>