diff --git a/android-client/PLAN.md b/android-client/PLAN.md index 362d35c..a79488b 100644 --- a/android-client/PLAN.md +++ b/android-client/PLAN.md @@ -387,11 +387,34 @@ d'interface d'édition. gagne par `uuid` sur `updated_at`, tombstones qui propagent les suppressions, et l'arbitrage de résurrection (une entrée modifiée après sa date de suppression survit à la tombstone). -5. **L'interface d'édition.** Modifier un champ, marquer l'entrée sale, bumper - `updated_at` en UTC (`toISOString` côté JS, `NowUTC` côté Delphi — mélanger - heure locale et UTC a déjà décalé l'arbitrage une fois). -6. **Le conflit 412** — retirer, refusionner, renvoyer, avec un nombre - d'essais borné. Le poste Windows fait exactement cela, en trois essais. +5. ~~**L'interface d'édition**~~ — **faite**, éditeur en ligne sur la ligne du + mot de passe. `updated_at` est bumpé en UTC par `PMA.VaultPatch`. +6. ~~**Le conflit 412**~~ — **écrit**, sous forme de **409** (le code de Gitea), + trois essais, en rejouant tirer→patcher→publier. **Jamais éprouvé** : il + faudrait publier depuis le poste pendant que le téléphone enregistre. + +### Vérifié sur appareil — 2026-08-17 + +``` +save: attempt 1 - GET +save: decrypt+patch in 4519 ms +save: re-encrypt in 23 ms +save: published, new sha 802515d4... +``` + +Les 23 ms mesurent l'économie de la clé réutilisée : la seconde dérivation +valait les mêmes 4,5 secondes que la première. + +**Ce qui reste ouvert**, par ordre d'importance : + +- le **409** n'a jamais tourné ; +- **pas d'édition hors ligne** : le téléphone patche l'instantané qu'il vient + de tirer, donc sans réseau *Save* échoue. C'est le prix de ne pas avoir de + fusion à écrire. Une file de modifications en attente la ramènerait, avec + l'arbitrage qui va avec ; +- **un seul champ** est modifiable. `PatchEntryField` prend déjà le nom du + champ, donc l'identifiant ou le site coûteraient une ligne ; créer ou + supprimer une entrée, en revanche, exige uuid et tombstones. ### Ce qu'on peut s'épargner