feat(android): a vault born here can be given a repository
Until now the two situations never met: a local vault had no repository, a pulled vault had no local container. The day both exist, the rule "the local container is the authority" means saves never reach the repository - and the two diverge in silence, which is the worst outcome available. Sync now merges them once and then deletes the local container: the repository becomes the authority and the device behaves like any other. That makes divergence impossible rather than unlikely. Order matters - publish first, delete after; the reverse would lose the whole vault if the publish failed. The remote is the base, never the local. It carries what the phone cannot rebuild: attachment bodies, the avatar, folder colours, and whatever the desktop adds next. Starting from the local would amputate all of it, and the desktop would adopt the amputated version on its next pull. Arbitration is the desktop's, term for term: last write wins on updated_at, a tombstone beats an older entry but not one edited after it - that one was revived on purpose. Timestamps are ISO 8601 UTC on both sides, milliseconds included, so lexicographic order IS chronological order. MergeSelfCheck asserts the four rules at startup in debug. The merge never runs against a real vault before it has run there.
This commit is contained in:
+34
-3
@@ -730,9 +730,40 @@ téléphone qu'on voudra ensuite ouvrir sur le poste demandera un import.
|
||||
bouton en bas d'écran, en deux temps, qui se désarme seul au bout de quatre
|
||||
secondes — un bouton armé indéfiniment se fait toucher par mégarde bien plus
|
||||
tard.
|
||||
4. **Réconcilier avec la synchronisation** : un coffre né seul auquel on
|
||||
ajoute un dépôt. C'est là que la fusion revient, et elle a été évitée
|
||||
jusqu'ici pour de bonnes raisons.
|
||||
4. **Réconcilier avec la synchronisation** — fait le 2026-08-21.
|
||||
|
||||
Jusqu'ici les deux situations ne se rencontraient pas : un coffre local
|
||||
n'avait pas de dépôt, un coffre tiré d'un dépôt n'avait pas de conteneur
|
||||
local. Le jour où les deux existent, la règle « le conteneur local fait
|
||||
autorité » fait que les enregistrements **n'atteignent jamais le dépôt** —
|
||||
et les deux divergent en silence, la pire des issues.
|
||||
|
||||
*Sync* fond donc les deux, **une fois**, puis **efface le conteneur local** :
|
||||
le dépôt devient l'autorité et l'appareil se comporte dès lors comme
|
||||
n'importe quel autre. C'est ce qui rend la divergence impossible plutôt
|
||||
qu'improbable. L'ordre compte — on publie d'abord, on efface ensuite ;
|
||||
l'inverse perdrait le coffre entier si la publication échouait.
|
||||
|
||||
**Le distant sert de base, jamais le local.** Il porte ce que le téléphone
|
||||
ne sait pas reconstruire : le contenu des pièces jointes, l'avatar, la
|
||||
couleur des dossiers, et ce que le poste ajoutera demain. Repartir du local
|
||||
amputerait tout cela, et le poste adopterait la version amputée au tirage
|
||||
suivant — la perte silencieuse contre laquelle `PMA.VaultPatch` existe.
|
||||
|
||||
L'arbitrage est celui du poste, terme à terme : dernier écrit gagnant sur
|
||||
`updated_at`, une pierre tombale l'emporte sur une entrée plus ancienne
|
||||
qu'elle, mais **pas** sur une entrée modifiée après — celle-là a été
|
||||
ressuscitée volontairement. Les horodatages étant de l'ISO 8601 UTC des deux
|
||||
côtés, millisecondes comprises, l'ordre lexicographique **est** l'ordre
|
||||
chronologique : aucune date à analyser.
|
||||
|
||||
Dépôt vide : rien à fusionner, on publie. Le 404 de Gitea étant ambigu —
|
||||
fichier absent ou dépôt qu'on n'a pas le droit de voir — on ne cherche pas à
|
||||
trancher : publier tranche, un jeton sans droit échouant au PUT avant que
|
||||
rien n'ait été effacé.
|
||||
|
||||
`MergeSelfCheck` vérifie les quatre règles au démarrage en débogage. La
|
||||
fusion ne tourne jamais contre un vrai coffre avant d'avoir tourné là.
|
||||
|
||||
### Vérifié : le poste reprend ce que le téléphone crée — 2026-08-21
|
||||
|
||||
|
||||
Reference in New Issue
Block a user