Daniel Kinzler proposed in e-mail:
I would recommend to pull the code for changing the content model out of the API and/or EditPage. The new revision should be forced to have the same model as the old revision when editing via action=edit (in the UI or API).
It should only be done programmatically, in PHP, for special cases (which may or may not need special permissions [like editcontentmodel or T76793's flow-create-board]
... it should be specific cases, with specific conversion logic, purpose, and permissions. Not something that users may or may not be able to do in general.
Instead, WikiPage should get a doUpdateContentModel method, similar to doUpdateRestrictions, which would use insertProtectNullRevision resp Revision::newNullRevision. Content::convert should be used to perform the actual conversion. A special flag may force the conversion to be skipped (re-interpreting the content instead of converting it).
WikiPage::doEditContent could probably enforce that the new Content has the same model as the old Content. That would enforce this restriction on a pretty low level (though page moves still need extra checks if the model is not recorded in the database).
Were this to be implemented, Flow would have to be updated to call doUpdateContentModel(); it currently calls doEditContent() to add its revision that changes a page's content model to 'flow-board'.