Resolve an AudienceSource into concrete MessageRecipients, then
fan out via CommunicationEngine.SendMessages. The translation step
is deliberately kept here (not on the engine) because it's
audience-aware: it knows about entity primary keys, the recipient
field mapping, and the skip-on-missing-field policy.
Records whose RecipientField is missing or empty are skipped and
returned in Skipped rather than failing the whole send — matches
the plan's "skip records missing the mapped field with a warning"
contract.
Resolve an
AudienceSourceinto concreteMessageRecipients, then fan out viaCommunicationEngine.SendMessages. The translation step is deliberately kept here (not on the engine) because it's audience-aware: it knows about entity primary keys, the recipient field mapping, and the skip-on-missing-field policy.Records whose
RecipientFieldis missing or empty are skipped and returned inSkippedrather than failing the whole send — matches the plan's "skip records missing the mapped field with a warning" contract.