feat(gherkin): ajouter features UI/Admin pour modération complète

Création de 6 nouvelles features Gherkin + documentation :

Features UI mobile (Flutter) :
- signalement-ui.feature : interface signalement avec 7 catégories
- historique-signalements.feature : suivi personnel des signalements
- badges-statistiques.feature : gamification Bronze/Argent/Or
- sanctions-appel.feature : notifications et processus d'appel

Features Admin dashboard (React) :
- dashboard-moderateur.feature : files d'attente et SLA temps réel
- outils-moderateur.feature : player Wavesurfer.js, transcription, historique créateur

Documentation :
- gherkin-moderation-overview.md : mapping complet règles métier, stats, coûts

Couverture :
- 190 scénarios couvrant 100% sections 14 (moderation-flows) et 19 (badges)
- Conformité DSA/RGPD/WCAG testée
- Stack : Go/Flutter/React avec Godog/flutter_gherkin/Cucumber.js
This commit is contained in:
jpgiannetti
2026-02-02 21:58:25 +01:00
parent 6ba0688f87
commit bac0423be9
7 changed files with 2466 additions and 0 deletions

View File

@@ -0,0 +1,410 @@
# language: fr
@ui @moderation @sanctions @appel
Fonctionnalité: Interface sanctions et processus d'appel (Mobile)
En tant que créateur de contenu
Je veux consulter mes sanctions et faire appel si nécessaire
Afin de comprendre les décisions et contester si je pense qu'il y a erreur
# 14.3 - Interface sanctions et appel
Contexte:
Étant donné que je suis un créateur de contenu
Et que je suis connecté à l'application mobile
# Notifications multi-canal
Scénario: Notification push immédiate après sanction
Étant donné que mon contenu vient d'être modéré
Quand la sanction est appliquée
Alors je reçois une notification push immédiate:
"""
Votre contenu a été modéré
Appuyez pour voir les détails
"""
Et la notification est marquée comme importante (son + vibration)
Et je peux cliquer pour accéder aux détails
Et la notification reste visible jusqu'à ce que je la lise
Scénario: Popup in-app au prochain lancement
Étant donné que mon contenu a été modéré
Et que je n'ai pas encore consulté la sanction
Quand j'ouvre l'application
Alors une popup modale s'affiche automatiquement avant tout:
"""
Attention
Votre contenu "Mon podcast #42" a été modéré.
Catégorie violée: 🚫 Haine & violence
Sanction: Strike 2/4 - Suspension 7 jours
[Voir les détails] [Plus tard]
"""
Et la popup est prioritaire (affichée avant le contenu de l'app)
Et je ne peux pas la fermer sans l'avoir lue (pas de bouton X)
Et je dois cliquer sur un bouton pour continuer
Scénario: Design de la popup de sanction
Étant donné que la popup de sanction s'affiche
Quand je vérifie le design
Alors le fond est rouge clair (#FFEBEE) pour signaler la gravité
Et l'icône est proéminente
Et le texte est clair et concis
Et les boutons sont bien visibles:
| bouton | style | couleur |
| Voir les détails| Primaire (plein) | Rouge |
| Plus tard | Secondaire (border)| Gris |
Et le design est professionnel et sérieux
# Page détaillée de la sanction
Scénario: Affichage de la page détails sanction
Étant donné que je clique sur "Voir les détails"
Quand la page s'affiche
Alors je vois toutes les informations obligatoires:
| section | contenu exemple |
| En-tête avec icône | Contenu modéré |
| Titre du contenu | "Mon podcast #42" |
| Date de publication | "Publié le 15/01/2026" |
| Catégorie violée | 🚫 Haine & violence (Article 3.2 CGU) |
| Raison détaillée | "Propos discriminatoires envers un groupe" |
| Passage problématique | "3:42-4:15" (avec player audio) |
| Transcription surlignée | "[texte problématique en rouge]" |
| Gravité de la sanction | Strike 2/4 - Suspension 7 jours |
| Conséquences futures | "Strike 3: 30j / Strike 4: Ban définitif" |
| Délai d'appel | "7 jours pour faire appel" |
| Bouton Contester | [Contester cette décision] |
| Lien CGU | [Voir les règles de la communauté] |
Et toutes les sections sont clairement séparées
Scénario: Player audio du passage problématique
Étant donné que je consulte les détails de la sanction
Quand je vois la section "Passage problématique"
Alors un player audio s'affiche avec le timestamp "3:42-4:15"
Et je peux écouter uniquement cette portion de l'audio
Et les contrôles sont simples: Play/Pause + volume
Et la waveform visualise le passage
Et je peux comprendre exactement ce qui pose problème
Scénario: Transcription avec mise en évidence
Étant donné que je consulte la transcription du passage
Quand j'affiche la transcription
Alors les mots/phrases problématiques sont surlignés en rouge
Et le contexte autour est affiché en gris
Et je peux voir exactement quels mots ont posé problème:
"""
[contexte gris]... et c'est pourquoi je pense que
[ROUGE: phrase discriminatoire problématique]
[contexte gris]... mais c'est mon opinion.
"""
Et la mise en évidence est claire
Scénario: Lien vers l'article des CGU
Étant donné que la sanction référence "Article 3.2 CGU"
Quand je clique sur le lien
Alors je suis redirigé vers les CGU
Et la section "Article 3.2 - Haine & violence" est mise en évidence
Et je peux lire exactement ce qui est interdit
Et je comprends mieux ma violation
# Escalade des sanctions
Scénario: Affichage de l'escalade des strikes
Étant donné que j'ai reçu le Strike 2
Quand je consulte la section "Gravité"
Alors je vois clairement l'escalade:
"""
Vous avez reçu le Strike 2/4
Historique:
Strike 1: Avertissement (il y a 3 mois)
Strike 2: Suspension 7 jours (aujourd'hui)
Prochaines étapes si récidive:
Strike 3: Suspension 30 jours
Strike 4: Ban définitif
Réhabilitation:
-1 strike tous les 6 mois sans incident
"""
Et je comprends la progression des sanctions
Et je suis motivé à ne pas récidiver
Scénario: Compteur de suspension visible
Étant donné que je suis suspendu pour 7 jours
Quand j'ouvre l'application
Alors une bannière persistante s'affiche en haut:
"""
Compte suspendu - 5 jours restants
"""
Et la bannière est visible sur toutes les pages
Et je vois le décompte en temps réel
Et je ne peux pas publier de nouveau contenu
# Accès à l'historique des sanctions
Scénario: Consulter l'historique des sanctions
Étant donné que je suis dans mon profil créateur
Quand je clique sur "Mes sanctions"
Alors je vois la liste de toutes mes sanctions passées:
| colonne | contenu exemple |
| Date | 15/01/2026 |
| Contenu | "Mon podcast #42" |
| Catégorie | 🚫 Haine & violence |
| Sanction | Strike 2 - Suspension 7j |
| Statut | Active / Terminée / Annulée |
| Appel | Aucun / En cours / Accepté / Rejeté |
| Action | [Faire appel] / [Détails] |
Et les sanctions sont triées par date décroissante
Scénario: Sanctions actives vs terminées
Étant donné que j'ai 3 sanctions dans mon historique
Quand j'affiche "Mes sanctions"
Alors les sanctions actives sont mises en évidence (fond rouge clair)
Et les sanctions terminées sont en gris
Et les sanctions annulées (après appel) sont en vert clair
Et je vois clairement l'état de chaque sanction
# Formulaire d'appel
Scénario: Accéder au formulaire d'appel depuis la notification
Étant donné que je consulte les détails d'une sanction
Et que le délai d'appel n'est pas dépassé (<7 jours)
Quand je clique sur "Contester cette décision"
Alors le formulaire d'appel s'affiche en plein écran
Et le formulaire est pré-rempli avec les informations de la sanction
Et je peux commencer à rédiger mon appel
Scénario: Structure du formulaire d'appel
Étant donné que le formulaire d'appel est affiché
Quand je vérifie les champs
Alors je vois la structure suivante:
| champ | type | limite | obligatoire |
| Sanction contestée | Texte (readonly) | - | oui |
| Raison de l'appel | Texte court | 50-1000 car. | oui |
| Arguments détaillés | Zone texte enrichie | 1000-5000 car. | oui |
| Preuves | Upload fichiers | 5 max, 10MB tot.| non |
| Bouton Annuler | Secondaire | - | - |
| Bouton Soumettre | Primaire | - | - |
Et tous les champs obligatoires sont marqués d'un astérisque rouge
Scénario: Validation du formulaire d'appel
Étant donné que je remplis le formulaire d'appel
Quand je clique sur "Soumettre l'appel"
Alors le système valide:
| règle | message d'erreur si non respecté |
| Raison >50 caractères | "La raison doit faire au moins 50 caractères" |
| Arguments >100 caractères | "Développez vos arguments (min 100 car.)" |
| Total fichiers <10 MB | "Taille totale des fichiers >10 MB" |
| Formats fichiers acceptés (PDF, JPG) | "Format de fichier non accepté" |
Et si une erreur existe, le champ est surligné en rouge
Et je dois corriger avant de pouvoir soumettre
Scénario: Upload de preuves
Étant donné que je veux joindre des preuves
Quand je clique sur "Ajouter des preuves"
Alors je peux choisir depuis:
| source | types acceptés |
| Galerie photos | JPG, PNG |
| Fichiers | PDF |
| Caméra (nouveau) | JPG |
Et je peux uploader jusqu'à 5 fichiers
Et la taille totale ne peut pas dépasser 10 MB
Et une progress bar s'affiche pendant l'upload
Scénario: Confirmation après soumission de l'appel
Étant donné que j'ai soumis un appel valide
Quand l'appel est enregistré
Alors une page de confirmation s'affiche:
"""
Appel envoyé avec succès
Numéro de ticket: #MOD-2026-00142
Votre appel sera examiné par un modérateur senior
sous 72h maximum (3 jours ouvrés).
Vous serez notifié de la décision par:
- Notification push
- Email
- Notification in-app
[Retour à mes sanctions]
"""
Et je reçois un email de confirmation identique
Et le statut dans "Mes sanctions" passe à "Appel en cours 🔍"
# Délai d'appel et compteur
Scénario: Compteur de jours restants pour faire appel
Étant donné que j'ai reçu une sanction il y a 3 jours
Quand je consulte les détails de la sanction
Alors je vois un compteur en haut de page:
"""
4 jours restants pour faire appel
"""
Et le compteur est en orange pour attirer l'attention
Et il se met à jour en temps réel (chaque jour)
Scénario: Délai d'appel dépassé
Étant donné que j'ai reçu une sanction il y a 8 jours
Quand je consulte les détails de la sanction
Alors le bouton "Contester cette décision" est désactivé (grisé)
Et un message s'affiche:
"""
Le délai de 7 jours pour faire appel est dépassé.
Cette décision est désormais définitive.
"""
Et je ne peux plus contester la sanction
# Suivi de l'appel
Scénario: Statut de l'appel dans l'historique
Étant donné que j'ai soumis un appel
Quand je consulte "Mes sanctions"
Alors je vois le statut de l'appel:
| statut appel | badge | couleur |
| Aucun appel | - | - |
| Appel en cours | En cours 🔍 | Orange |
| Appel accepté | Accepté | Vert |
| Appel rejeté | Rejeté | Rouge |
| Sanction réduite | Partiellement accepté 🟡 | Bleu |
Et un badge de notification m'alerte si le statut change
Scénario: Notification quand l'appel est traité - Accepté
Étant donné que mon appel a été accepté
Quand le modérateur prend la décision
Alors je reçois une notification push + in-app:
"""
Appel accepté
Votre sanction a été annulée.
Le strike a été retiré et votre contenu a été rétabli.
[Voir les détails]
"""
Et je reçois un email détaillé avec la justification
Et le statut dans mes sanctions passe à "Annulée"
Scénario: Notification quand l'appel est traité - Rejeté
Étant donné que mon appel a été rejeté
Quand le modérateur prend la décision
Alors je reçois une notification:
"""
Appel rejeté
Votre appel a été examiné et la sanction est maintenue.
Cette décision est définitive.
[Voir la justification]
"""
Et je reçois un email avec la justification détaillée
Et le statut reste "Active"
Et je ne peux pas faire de second appel
Scénario: Notification intermédiaire si délai >72h
Étant donné que mon appel complexe est en cours depuis 3 jours
Quand le délai de 72h est dépassé
Alors je reçois une notification intermédiaire:
"""
Appel #MOD-2026-00142 en cours
Votre appel nécessite un examen approfondi.
Réponse sous 2 jours maximum.
Merci de votre patience.
"""
Et je suis rassuré que mon appel n'est pas oublié
# Page détails de la réponse à l'appel
Scénario: Détails de la réponse - Appel accepté
Étant donné que mon appel a été accepté
Quand je consulte les détails de la réponse
Alors je vois:
"""
Décision: Annulation de la sanction
Justification:
Après examen de votre appel, nous reconnaissons que le
passage mentionné était dans un contexte éducatif et ne
constitue pas une violation des règles de la communauté.
Actions prises:
Strike retiré de votre compte
Suspension annulée
Contenu rétabli sur la plateforme
Cette décision est définitive.
"""
Et je suis satisfait de la transparence
Scénario: Détails de la réponse - Sanction réduite
Étant donné que mon appel a été partiellement accepté
Quand je consulte les détails
Alors je vois:
"""
Décision: Réduction de la sanction 🟡
Justification:
Nous reconnaissons des circonstances atténuantes.
Sanction initiale: Strike 2 - Suspension 7 jours
Sanction réduite: Strike 1 - Suspension 3 jours
Cette décision est définitive.
"""
Et je vois le compteur de suspension mis à jour (3 jours au lieu de 7)
# Dark mode et accessibilité
Scénario: Support du dark mode
Étant donné que j'ai activé le dark mode
Quand j'affiche la page de sanction
Alors les couleurs s'adaptent:
| élément | couleur light | couleur dark |
| Fond page | Blanc | Noir (#121212) |
| Carte sanction | Rouge clair | Rouge foncé |
| Texte principal | Noir | Blanc |
| Passage problématique | Rouge | Rouge (#FF6B6B) |
| Bouton Contester | Rouge (#DC3545) | Rouge (#F85149) |
Et le contraste reste suffisant
Scénario: Accessibilité lecteur d'écran
Étant donné que j'utilise un lecteur d'écran
Quand je navigue dans la page de sanction
Alors chaque section est clairement annoncée:
"""
Contenu modéré. Attention.
Votre contenu "Mon podcast numéro 42" a été modéré.
Catégorie violée: Haine et violence, Article 3 point 2.
Raison: Propos discriminatoires envers un groupe.
Passage problématique: 3 minutes 42 secondes à 4 minutes 15 secondes.
Sanction: Strike 2 sur 4. Suspension 7 jours.
Bouton: Contester cette décision.
"""
Et tous les éléments sont accessibles au clavier
# Coût et conformité
Scénario: Coût de la fonctionnalité
Étant donné que l'interface sanctions et appel est en place
Quand on évalue le coût
Alors le développement est 100% interne (Flutter)
Et aucun service tiers n'est utilisé
Et le coût opérationnel est de 0
Et les emails de notification coûtent ~0.001/email
Scénario: Conformité DSA - Transparence
Étant donné que le système de sanction est en place
Quand on vérifie la conformité DSA
Alors chaque sanction contient:
| élément DSA requis | présent |
| Référence précise à la règle violée | |
| Explication claire | |
| Preuve (extrait + transcription) | |
| Possibilité de recours | |
| Délai de recours clairement indiqué | |
| Réponse motivée au recours | |
Et le système est conforme au Digital Services Act