Builds a ProjectMember from a host membership and resolved profile.
The ID uses sanityUserId when supplied, otherwise membershipId.
The engine rejects unresolved project membership IDs in new assignments.
Missing display names read Unknown user, never an ID; empty optional
display fields are omitted. Roles default to an empty list and contain only name
and a nonblank title when available.
Builds a ProjectMember from a host membership and resolved profile. The ID uses
sanityUserIdwhen supplied, otherwisemembershipId. The engine rejects unresolved project membership IDs in new assignments.Missing display names read
Unknown user, never an ID; empty optional display fields are omitted. Roles default to an empty list and contain onlynameand a nonblanktitlewhen available.