I’m building local-first software, and I’m increasingly uncomfortable with client libraries treating every failed sync as a transient error. Suppose two offline clients edit the same customer record, then reconnect. A generic retry can quietly apply last-write-wins, which is simple but may erase someone’s intent.
I’d rather the interface return something visibly different: `Conflict`, `Rejected`, or `NeedsReview`. The application could merge fields, ask a user, or deliberately refuse the update. Some data structures can merge automatically, but a converged result is not necessarily the business-correct result.
The downside is real: stronger conflict modeling makes APIs safer, but also makes simple apps and prototypes more cumbersome. Should conflict semantics live in the type system, the API contract, or the application layer? I’d especially like counterexamples from people who have shipped offline-capable systems.