Just the first example that pops into my head: edit A sets an invoice status to paid, edit b changes the invoice amount from 100 to 120. The merge is a paid invoice with an incorrect amount.
A workaround would be to record a separate PaidInvoice that wont be changed by the application logic.
But that's just a really trivial example that only involves scalar fields inside a single object, and also relies on the application logic considering all ways that the CRDT might behave.
There are countless ways to end up with data that violates the constraints of the domain.
Is there any theoretical groundwork happening on how CRDTs can preserve domain semantics?