I don't think there's much you can do here, as per the usual with Opportunity Contact Role. Since there's no triggers or validation rules on that object, you don't have any real-time chance to intervene in the transaction.
You're stuck then with either (a) Scheduled Apex to locate and remedy those records; or (b) observing in real time with Change Data Capture, which does support OpportunityContactRole
.
The only route I can see, and it's a tricky one, would be a component on the Lightning record page for Opportunity that listens for change data capture events for Contact Roles on its own Opportunity. It could then post a Toast message, open a modal, or even set a flag on the Opportunity itself to prevent it from saving. But that's a lot of work (with pre-release technology!) and it wouldn't buy you a guarantee of data integrity since it's purely reactive in the UI layer.
Lots of good Idea Exchange posts to vote up on Opportunity Contact Roles, although I don't see this specific one among them: