I’m building a local-first app, and my current rule is blunt: an offline client should never replay a queued mutation after reconnecting unless the server contract explicitly makes that safe. Seamless UX is attractive, but a replayed command is not the same thing as synchronizing state. It could charge a payment twice, resend an invitation, or provision another resource.
SDKs should require an idempotency key for replayable writes, expose a durable queue that users and developers can inspect, and leave conflict policy to the application. Automatic retries are reasonable only when the API promises deduplication or equivalent acknowledgement semantics; HTTP method names are not enough. A pending or indeterminate operation is sometimes safer than pretending success.
Would you trust a framework to retry writes automatically? I’d especially like counterexamples from production systems where that tradeoff worked safely.