When there’s a conflict between the remote and local versions of a record, I have a function to merge the changes and call storeObject().
When I run this merge function synchronously (from the change event handler) or with queueMicrotask(), I get a second change event with a conflict. If I run the merge function using setTimeout(), I don’t.
Is that the official contract? Conflict resolution can’t happen until the next iteration of the task queue?