Automerge has fairly robust support for these kinds of use-cases around lists, which we use quite a lot, but we haven't actually needed them for numbers (though I expect we may want them eventually.)
With OT, you send a na (number add) operation, so this would work fine. Indeed, if you treat the number as a string, then you have a problem.
I bet you can run really far with this general idea. But there is no panacea.
To that end, the basics of math in associative, cumulative, distributive, etc., go together to create an algebra of what you can automate rather easily. I think most of us stopped thinking in terms of those laws years ago. To the point that it is probably odd to folks that stayed close to them.
I think you mean commutative. It certainly is associative.
Wikipedia has some examples: https://en.m.wikipedia.org/wiki/Conflict-free_replicated_dat...
I wrote a middleware for Redux which propagates actions peer-to-peer in a consistent order using these timestamps and the scuttlebutt gossip protocol, you might find it interesting.
If User A incremented 100, and saved it down; then User B loaded this saved state and incremented 101, it'd be 102.
For example, say you have a list AND a counter. Everytime you add an item to the list, you need to increment the counter, as an invariant of your system.
Of course, it's a contrived example, but you get the point: things can get more complicated and the system may break as a result, unless you're very careful.
But we merge by using differential synchronization (kinda) to resolve local changes and remote changes (to construct a "patch") by keeping an unchanged copy of the upstreams latest version (from the clients perspective).