Live-query subscribable fields. The descriptor's
dependsOnFields defaults to ['name'] (descriptor name =
source field name), so a FieldChangedEvent { field: 'name' }
from setName triggers re-projection automatically. The
ShadowChangedEvent entry covers future hood/disguise
shadows that change the rendered name without firing a field
change.
Persistent fields.
alternateNamesis an array of plain objects — the generic Hydrator copy works without a custom persistenceHandler.