> For values that don't have a natural merge function (or where you don't want to bother writing one), would it make sense to sync update logs instead?

Yes, in fact you can implement this within the current framework, for example with our group chat River, each room state maintains a list of the N most recent messages sorted by (approximate) timestamp.

The idea is that you can adapt the merge logic to the needs of the specific application, and I think a time ordered event log will be a common pattern.

How does it work in practice? Is it sorted by timestamp and content hash for uniqueness?

Messages in river are sorted by timestamp using a (non-cryptographic) hash of the message signature as tie-breaker, essentially a content hash.

One weakness is that we trust the message author to provide an accurate message timestamp, however bad behavior such as manipulating timestamps can be addressed by banning the user from the room.

If due to some technical glitch someone's timestamp is just off by a minute or something, I wouldn't exactly call that “bad behavior” that warrants banning someone, but it does mess with ordering in a chat application...

It could, but it hasn't been a problem in practice. If it becomes one we can certainly address it.