This is very disheartening, because there are a few reasonable strategies:
1. CRDT like linear change rules.
2. Vector clocks.
3. Forking the entire tree and allowing merge queries, creating a DAG of the state that can be interactively and speculatively remerged.
Just picking one winner arbitrary and silently discarding all peers sounds like the kind of thing that gets labeled as a bug when we examine concurrent data stores.
Automerge uses vector clocks internally to track visibility and minimize conflict and retains all alternative values in the _conflicts list for that value.
Automerge must select one result to be the default consistently across all uncoordinated peers. If you don't do this, different nodes may see different documents during a conflict state, which is undesirable.
1. CRDT like linear change rules.
2. Vector clocks.
3. Forking the entire tree and allowing merge queries, creating a DAG of the state that can be interactively and speculatively remerged.
Just picking one winner arbitrary and silently discarding all peers sounds like the kind of thing that gets labeled as a bug when we examine concurrent data stores.