Drafts grounded in the thread, not a mail merge
A message is composed against everything already recorded for that lead across email and calls — one timeline, not a spreadsheet row with a first-name token in it.
HOW · composeOutreach() reads the lead’s cross-channel timeline and the workspace persona. The send path composes only when you did not supply a body, and the credit is metered after a successful draft, not before.