La synchronisation est une fonction pure, pas un effet
Le piège classique du local-first : un état vide qui écrase un compte plein, ou une édition locale perdue par un rechargement cloud. J'ai sorti la décision des effets React vers un module isolé qui prend un instantané en entrée et rend une décision explicite - pousser, appliquer, ne rien faire - accompagnée d'une raison et d'un ordre d'archivage. La règle est « le plus récent gagne, avec archivage systématique de la version remplacée » : aucune version n'est jamais détruite sans copie. Un échec de lecture n'est explicitement pas traité comme un compte vide, ce qui empêche d'effacer un compte sur une simple coupure réseau. Conséquence pratique : tous les cas de conflit se testent en ligne de commande, sans navigateur.
- apps/web/src/sync-policy.ts
- apps/web/src/backup.ts