The reconciler is designed around arrival order, not transport names.
| Arrival order | Result |
|---|---|
| optimistic → acknowledgement → observation | One entry; pending → acknowledged → synced. |
| optimistic → observation with mutation ID → acknowledgement | One entry; the late acknowledgement is idempotent. |
| optimistic → canonical observation without mutation ID → acknowledgement | Two entries exist temporarily, then collapse to the optimistic viewKey. |
| canonical observation repeated by multiple sources | One entry per canonical ID. |
| optimistic → synced observation → late rejection | The synced entry is not downgraded. |
| two records with identical content and no identity evidence | They remain separate. |
| two mutations mapped to one canonical ID | The conflicting mapping throws. |
The test suite executes each of these cases. The package does not impose event
versioning; use a custom merge function if your domain needs sequence numbers,
timestamps, or field-level conflict resolution.