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 fall back to membershipId; 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 fall back to
membershipId; empty optional display fields are omitted. Roles default to an empty list and contain onlynameand a nonblanktitlewhen available.