Files
MaksTinyWorkshop 81fde91259 docs(knowledge): capitalisation workflow + ux — intégration du triage local (mai-juin 2026)
Triage et intégration des propositions workflow et UX du buffer 95_a_capitaliser.md.

WORKFLOW :
- risques/story-tracking.md : 24 risques de suivi de story (enabler AC non-bloquant,
  tests plumbing vs scénario, reformat hors scope, xit sans story de suivi, re-scope mid-PR,
  statut migré non vérifié, périmètre auto-déclaré vs git diff, composant/page livré sans
  câblage — reciblages venus de backend #21 et frontend #257)
- patterns/general.md : audit cartographique pré-chantier, Go/No-Go par lot, sub-agent review
  fresh-context, sweep read-only délégué (#156), revue adverse de spec, audit-first migration

UX (domaine amorcé — était vide) :
- patterns/general.md : 9 patterns (mount-based read, fiche détail single-scroll, FAB étendu,
  ligne de contexte filtres, état read-only caché, avatar par hash, audit a11y touch targets)
- risques/general.md : 5 risques (bouton retour dans ScrollView #108, lien sans handler,
  wording cross-écran divergent, token sans détection, padding multi-écrans)
- READMEs ux/workflow mis à jour

Vérifié : aucun doublon d'ancre/titre, fichiers racine 40_/90_ non modifiés (propositions
réservées pour validation séparée). Source 95_ non purgée (purge en fin de capitalisation).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 15:48:53 +02:00

5.6 KiB


title: UX — Risques & vigilance : Général domain: ux bucket: risques tags: [mobile, navigation, handler, wording, tokens, a11y] applies_to: [design, implementation, review] severity: medium validated_on: 2026-06-25 source_projects: [app-alexandrie]

UX — Risques & vigilance : Général

Extrait de la base de connaissance Lead_tech. Voir knowledge/ux/risques/README.md pour l'index complet.


Bouton retour placé à l'intérieur du ScrollView

Risques

  • Sur une app mobile RN/Expo avec une TopBar globale sans back natif, un bouton retour ajouté localement dans le <ScrollView> disparaît dès que l'utilisateur défile
  • Sur une page critique (gestion d'abonnement, résiliation, support), perdre l'accès au retour pendant le scroll est un piège UX direct

Symptômes

  • Le bouton retour est le premier enfant du contenu scrollable et défile avec lui ; il devient inaccessible plus bas dans une page longue

Bonnes pratiques / mitigations

  • Tout bouton retour local doit vivre hors du ScrollView : header local sticky en <View> parent (flex:1) + ScrollView frère.

  • Stop conditions : ne PAS doubler insets.top (le header le consomme → contentInset.top = 0) ; ne PAS placer le bouton dans contentContainerStyle. Si l'app utilise <Stack.Screen> Expo Router avec header natif, préférer headerBackVisible: true.

  • Filet de test : test statique vérifiant qu'un fichier avec handleBack ne place pas le <Pressable accessibilityLabel="Retour"> dans un <ScrollView>.

  • Contexte technique : RN/Expo + TopBar globale — app-alexandrie 28-05-2026 (ux-cleanup-2)


Bouton/lien sans handler laissé dans l'UI ("hors scope")

Risques

  • Un bouton survit dans l'UI sans onPress (résidu de template ou de dépendance retirée) : il tapote sans rien faire → boucle de frustration, l'utilisateur conclut que l'app est cassée et abandonne (grave sur le flow auth, critique pour l'acquisition)
  • "Hors scope" utilisé comme argument pour laisser passer → dérive de dette story après story

Symptômes

  • <TouchableOpacity> / <Pressable> visible sans prop onPress (ex. bouton "Facebook" sans OAuth côté API)

Bonnes pratiques / mitigations

  • Règle : tout bouton/lien visible doit avoir un onPress qui fait quelque chose. Si la feature n'est pas livrée : supprimer le bouton (défaut) ; OU le mettre derrière un feature flag interne ; OU afficher un toast/modal "Bientôt disponible".

  • Garde-fou review : grep <TouchableOpacity/<Pressable sans onPress= → finding HIGH. "Hors scope" n'est jamais un permis : un bouton mort sur un écran qu'on édite est dans le scope.

  • Contexte technique : RN/Expo — app-alexandrie 29-05-2026 (ux-cleanup-5, login.tsx)


Wording divergent cross-écran pour le même état métier

Risques

  • Deux écrans/composants affichent le même état métier (NOT_STARTED, OUT_OF_STOCK) avec des libellés différents, souvent parce que livrés par des stories distinctes
  • L'utilisateur traverse les écrans et voit deux mots pour le même état → confusion ; ne casse aucun test, dette qui s'accumule en silence

Symptômes

  • CourseListItem affiche "Nouveau" pour NOT_STARTED, ProgressionInline affiche "Pas encore commencé" pour le même état

Bonnes pratiques / mitigations

  • Centraliser le mapping état → libellé dans une seule fonction pure exportée (statusLabel(state) => string) consommée par tous les écrans.

  • Review : grep les libellés de status sur les écrans du domaine ; > 1 wording par état = finding MEDIUM.

  • Préférer les libellés courts et positifs ("Nouveau" > "Pas encore commencé").

  • Contexte technique : RN/Expo — app-alexandrie 29-05-2026 (ux-cleanup-6/7)


Règle d'usage de token sans stratégie de détection

Risques

  • Un token décoratif (outlineVariant MD3 marqué "ne pas utiliser pour des séparations fonctionnelles") continue d'être utilisé pour des bordures fonctionnelles
  • La règle reste écrite dans le README mais inappliquée → divergence README vs code

Symptômes

  • Callsites résiduels utilisant le token décoratif en borderColor/borderTopColor malgré la règle documentée

Bonnes pratiques / mitigations

  • Une règle d'usage de token doit être assortie d'une stratégie de détection : (1) lint custom qui flag le token dans une prop bordure/couleur ; (2) audit récurrent (CI cron qui liste les usages) ; (3) renommer le token (outlineDecorative rend l'intention explicite).

  • Le coût "écrire la règle" est ~10 min, le coût "détecter les violations" est récurrent — investir dans la détection automatique.

  • Contexte technique : design tokens MD3 — app-alexandrie 30-05-2026 (ux-cleanup-8/11)


Augmenter le padding d'un composant réutilisé multi-écrans (touch targets)

Risques

  • Élargir un touch target en augmentant le padding d'un composant réutilisé multi-écrans casse le layout des callers (liste serrée, ligne d'icônes header avec gap fixe)

Symptômes

  • Une cible tactile passe sous 44pt ; la corriger par padding change la taille visuelle et décale les callers

Bonnes pratiques / mitigations

  • Pour un composant réutilisé, préférer hitSlop au padding : seul effet = zone tap étendue, taille visuelle inchangée (cf. pattern d'audit dans ux/patterns/general.md).

  • Contexte technique : RN/Expo a11y — app-alexandrie 31-05-2026 (ux-cleanup-14)