docs: A11 fixed, plus its false-positive and deleted-entry scenarios

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-07-23 22:45:10 +01:00
parent 5f807bcf23
commit de50a5f71f
+20 -14
View File
@@ -72,9 +72,21 @@ Préparer : 3 entrées `A`, `B`, `C`, dont `A` dans le dossier `Work` avec le ta
- **ACTION** : `A` ouverte → Settings → *Fetch missing* / *Re-fetch all* favicons - **ACTION** : `A` ouverte → Settings → *Fetch missing* / *Re-fetch all* favicons
- **ATTENDU** : l'aperçu d'icône **dans l'éditeur** se met à jour tout seul (pas seulement la carte). Idem après un import en mode overwrite qui apporte une icône. - **ATTENDU** : l'aperçu d'icône **dans l'éditeur** se met à jour tout seul (pas seulement la carte). Idem après un import en mode overwrite qui apporte une icône.
### A11 · sync / import pendant que l'éditeur est ouvert — **trou connu** ### A11 · sync / import pendant que l'éditeur est ouvert
- **ACTION** : `A` ouverte + dirty → lancer *Sync now* (ou importer un JSON en mode overwrite) qui met `A` à jour → Save - **ACTION** : `A` ouverte + dirty → lancer *Sync now* (ou importer un JSON en mode overwrite) qui met `A` à jour → Save
- **ATTENDU AUJOURD'HUI** : le Save de l'éditeur écrase la version venue du sync/import. **Non corrigé** — voir « Reste à traiter » plus bas. - **ATTENDU** : modale « Entry changed elsewhere ». **Annuler ⇒ rien n'est écrit** (la version du sync/import survit, l'éditeur reste ouvert le temps de recopier). **Overwrite ⇒** la version de l'éditeur gagne.
### A12 · pas de fausse alerte (non-régression d'A11)
Aucun de ces enchaînements ne doit afficher « Entry changed elsewhere » :
- **A12a** : `A` ouverte + dirty → Save → modifier encore → Save (le rechargement post-save re-cale la référence)
- **A12b** : `A` ouverte + dirty → batch *Add tag* / *Move to folder* sur `A` → Save (l'éditeur a absorbé le changement)
- **A12c** : `A` ouverte + dirty → supprimer son dossier → Save (cf. A7)
- **A12d** : `A` ouverte + dirty → *Fetch missing* favicons → Save (l'icône est hors payload éditeur)
- **A12e** : `A` ouverte + dirty → sync **sans** changement distant sur `A` → Save
### A13 · entrée supprimée ailleurs pendant l'édition
- **ACTION** : `A` ouverte + dirty → un sync distant supprime `A` (tombstone) → Save
- **ATTENDU** : pas de plantage. L'entrée n'est plus en mémoire → le contrôle A11 passe la main ; le PUT échoue proprement avec un toast d'erreur.
--- ---
@@ -168,14 +180,7 @@ Symptôme du bug : après relance, lignes au nom vide / `(no name)`.
## Reste à traiter (constaté pendant l'audit, non corrigé) ## Reste à traiter (constaté pendant l'audit, non corrigé)
1. **Sync / import pendant l'édition** (scénario A11). `editorAbsorbChange` 1. **Modale d'entrée héritée = code mort.** `openEntryModal` n'a **aucun
ne couvre que les écritures locales tag/dossier. Un vrai filet serait de
mémoriser `updated_at` à l'ouverture de l'éditeur et, au Save, de comparer
avec la valeur courante en mémoire : si elle a bougé, demander
« cette entrée a changé ailleurs — écraser ? ». Ça couvre d'un coup sync,
import, et tout futur chemin d'écriture.
2. **Modale d'entrée héritée = code mort.** `openEntryModal` n'a **aucun
appelant** ; `saveEntry`, `closeEntryModal`, le markup `#entryModal` et appelant** ; `saveEntry`, `closeEntryModal`, le markup `#entryModal` et
leurs listeners ne sont plus atteignables. Danger : `saveEntry` fait un PUT leurs listeners ne sont plus atteignables. Danger : `saveEntry` fait un PUT
**partiel** (ni `kind`, ni `totp_secret`, ni `custom_fields`, ni **partiel** (ni `kind`, ni `totp_secret`, ni `custom_fields`, ni
@@ -183,7 +188,8 @@ Symptôme du bug : après relance, lignes au nom vide / `(no name)`.
à ne jamais refaire. À supprimer (JS + HTML) tant qu'il n'est pas recâblé à ne jamais refaire. À supprimer (JS + HTML) tant qu'il n'est pas recâblé
par erreur. par erreur.
3. **Click-outside** : `#busyOverlay` et `.toast` ne sont pas dans la liste 2. **Attachments hors garde A11.** Le contrôle « changed elsewhere » couvre le
blanche. Cliquer un toast ou l'overlay d'attente pendant une opération payload de l'entrée, pas ses pièces jointes (table séparée, écrites par
longue ferme l'éditeur. Impact faible, correctif = 2 lignes dans la même leurs propres endpoints). Un sync qui remplace une pièce jointe pendant
liste. l'édition n'est pas signalé. Faible risque : l'éditeur ne re-ship jamais
les pièces jointes existantes, donc il n'y a rien à écraser.