I think we are relying on a little more magic than actually exists - e.g in RecurUpgradeEmail/Render we have this snippet:
$rendered = WorkflowMessage::render(FALSE) ->setLanguage($email['contact_id.preferred_language']) ->setValues(['contributionRecurID' => $this->getContributionRecurID(), 'contactID' => $this->getContactID()]) ->setWorkflow('recurring_upgrade_message')->execute();
and we expect any contribution_recur tokens to refer to the recur with the supplied contribution recur ID. But it seems that it's just picking the first contribution_recur on the record. @AMJohnson noticed an amount mismatch in her recurring upgrade thank you email. She had an older Braintree recur for $1.10 and a new $1 adyen recur that she upgraded to $1.50, so the Recur Upgrade TY email should have mentioned $1.50. Instead it mentioned $1.10.