Initial commit
This commit is contained in:
327
features/moderation/sanctions-notifications.feature
Normal file
327
features/moderation/sanctions-notifications.feature
Normal file
@@ -0,0 +1,327 @@
|
||||
# language: fr
|
||||
|
||||
@moderation @sanctions
|
||||
Fonctionnalité: Sanctions et notifications de modération
|
||||
|
||||
# 14.3 - Sanctions
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un créateur de contenu
|
||||
Et que j'ai publié un contenu
|
||||
|
||||
# 14.3.1 - Notification au créateur (multi-canal)
|
||||
|
||||
Scénario: Notification multi-canal après sanction
|
||||
Étant donné que mon contenu a été modéré
|
||||
Quand la sanction est appliquée
|
||||
Alors je reçois une notification sur 3 canaux:
|
||||
| canal | timing | contenu |
|
||||
| Push | Immédiat | "Votre contenu a été modéré" |
|
||||
| In-app | Au prochain lancement| Popup détaillée avec bouton "Voir détails" |
|
||||
| Email | Dans l'heure | Notification complète avec lien d'appel |
|
||||
Et chaque canal contient un lien vers les détails complets
|
||||
|
||||
Scénario: Notification push immédiate
|
||||
É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
|
||||
Et le message est court: "⚠️ Votre contenu a été modéré"
|
||||
Et je peux cliquer pour voir les détails
|
||||
Et la notification utilise Firebase Cloud Messaging (Android) ou APNs (iOS)
|
||||
Et le coût est de 0€
|
||||
|
||||
Scénario: Popup in-app au prochain lancement
|
||||
Étant donné que mon contenu a été modéré
|
||||
Quand j'ouvre l'application
|
||||
Alors une popup détaillée s'affiche automatiquement
|
||||
Et la popup contient:
|
||||
| élément | description |
|
||||
| Titre du contenu | "Mon podcast #42" |
|
||||
| Icône d'avertissement | ⚠️ |
|
||||
| Catégorie violée | 🚫 Haine & violence |
|
||||
| Sanction | Strike 2/4 - Suspension 7 jours |
|
||||
| Bouton "Voir détails" | Redirige vers page détaillée |
|
||||
| Bouton "Compris" | Ferme la popup |
|
||||
Et je ne peux pas fermer la popup sans l'avoir vue
|
||||
|
||||
Scénario: Email de notification complet dans l'heure
|
||||
Étant donné que mon contenu a été modéré à 14:00
|
||||
Quand la sanction est appliquée
|
||||
Alors je reçois un email avant 15:00 (dans l'heure)
|
||||
Et l'objet de l'email est "Modération de votre contenu \"[Titre du contenu]\""
|
||||
Et l'email contient toutes les informations détaillées
|
||||
Et le coût est d'environ 0.001€ par email (Brevo, Resend)
|
||||
|
||||
# 14.3.2 - Détail de la sanction
|
||||
|
||||
Scénario: Email de notification complet et structuré
|
||||
Étant donné que mon contenu "Mon podcast #42" a été modéré
|
||||
Quand je reçois l'email de notification
|
||||
Alors l'email contient la structure suivante:
|
||||
"""
|
||||
Objet : Modération de votre contenu "Mon podcast #42"
|
||||
|
||||
Bonjour @mon_pseudo,
|
||||
|
||||
Votre contenu "Mon podcast #42" publié le 15/01/2026 a été modéré.
|
||||
|
||||
Catégorie violée : 🚫 Haine & violence (Article 3.2 CGU)
|
||||
Raison : Propos discriminatoires envers un groupe de personnes
|
||||
|
||||
Extrait audio concerné : 3:42-4:15
|
||||
Transcription : "[passage problématique surligné en rouge]"
|
||||
|
||||
Sanction : Strike 2/4
|
||||
Conséquence : Suspension de votre compte pendant 7 jours
|
||||
|
||||
Vous pouvez contester cette décision sous 7 jours :
|
||||
[Lien formulaire d'appel]
|
||||
|
||||
L'équipe RoadWave
|
||||
"""
|
||||
|
||||
Scénario: Page détaillée de la sanction in-app
|
||||
Étant donné que je clique sur "Voir détails" dans la notification
|
||||
Quand la page détaillée s'affiche
|
||||
Alors je vois les 6 éléments obligatoires:
|
||||
| élément | contenu |
|
||||
| 1. Catégorie violée | 🚫 Haine & violence (Article 3.2 CGU) |
|
||||
| 2. Raison détaillée | Explication claire et non juridique |
|
||||
| 3. Extrait audio | Timestamp exact: 3:42-4:15 |
|
||||
| 4. Transcription | Texte problématique surligné en rouge |
|
||||
| 5. Gravité | Strike actuel + conséquences (Strike 2/4, 7j susp) |
|
||||
| 6. Recours | Lien formulaire d'appel + délai 7j |
|
||||
|
||||
Scénario: Affichage du passage problématique avec timestamp
|
||||
Étant donné que la page détaillée de la sanction est affichée
|
||||
Quand je consulte l'extrait audio concerné
|
||||
Alors le timestamp exact est affiché: "3:42-4:15"
|
||||
Et je peux écouter uniquement cette portion de l'audio
|
||||
Et un player audio intégré permet l'écoute du passage
|
||||
Et la transcription correspondante est affichée en dessous
|
||||
Et les mots/phrases problématiques sont surlignés en rouge
|
||||
|
||||
Scénario: Référence précise aux CGU
|
||||
Étant donné que la sanction fait référence à l'Article 3.2 des CGU
|
||||
Quand je clique sur "Article 3.2"
|
||||
Alors je suis redirigé vers la section correspondante des CGU
|
||||
Et la section "Haine & violence" est mise en évidence
|
||||
Et je peux lire exactement ce qui est interdit
|
||||
Et cela m'aide à comprendre mon erreur
|
||||
|
||||
Scénario: Gravité de la sanction avec système de strikes
|
||||
Étant donné que c'est mon 2ème strike
|
||||
Quand je consulte les détails de la sanction
|
||||
Alors je vois clairement "Strike 2/4"
|
||||
Et les conséquences sont explicitées:
|
||||
"""
|
||||
Strike 2/4 - Suspension 7 jours
|
||||
|
||||
Que se passe-t-il ensuite?
|
||||
- Strike 3: Suspension 30 jours
|
||||
- Strike 4: Ban définitif
|
||||
|
||||
Comment éviter les strikes?
|
||||
- Lire et respecter les règles de la communauté
|
||||
- Réhabilitation: -1 strike tous les 6 mois sans incident
|
||||
"""
|
||||
Et je comprends l'escalade des sanctions
|
||||
|
||||
# 14.3.3 - Processus d'appel
|
||||
|
||||
Scénario: Accès au formulaire d'appel depuis la notification
|
||||
Étant donné que j'ai reçu une notification de modération
|
||||
Quand je clique sur "Contester cette décision"
|
||||
Alors je suis redirigé vers le formulaire d'appel
|
||||
Et le formulaire est pré-rempli avec les informations de la sanction
|
||||
Et je peux commencer à rédiger mon appel
|
||||
|
||||
Scénario: Accès au formulaire d'appel depuis "Mes sanctions"
|
||||
Étant donné que j'ai reçu une sanction il y a 2 jours
|
||||
Quand j'ouvre "Profil créateur > Mes sanctions"
|
||||
Alors je vois la liste de mes sanctions
|
||||
Et chaque sanction a un bouton "Faire appel" (si délai <7j)
|
||||
Et je peux accéder au formulaire d'appel
|
||||
|
||||
Scénario: Structure du formulaire d'appel
|
||||
Étant donné que j'ouvre le formulaire d'appel
|
||||
Quand le formulaire s'affiche
|
||||
Alors je vois les champs suivants:
|
||||
| champ | type | obligatoire | description |
|
||||
| Sanction contestée | Pré-rempli (readonly) | oui | "Strike 2 - Podcast #42" |
|
||||
| Raison de l'appel | Texte (50-1000 car) | oui | Explication courte de la contestation |
|
||||
| Arguments détaillés | Zone texte enrichie | oui | Arguments complets |
|
||||
| Preuves | Upload fichiers | non | Max 5 fichiers, 10 MB total |
|
||||
Et tous les champs obligatoires sont marqués d'un astérisque
|
||||
|
||||
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 les champs obligatoires
|
||||
Et si un champ obligatoire est vide, une erreur s'affiche
|
||||
Et si la raison fait moins de 50 caractères, une erreur s'affiche
|
||||
Et si tout est valide, l'appel est soumis
|
||||
|
||||
Scénario: Confirmation après soumission de l'appel
|
||||
Étant donné que j'ai soumis un appel valide
|
||||
Quand l'appel est enregistré
|
||||
Alors un numéro de ticket unique est généré: "#MOD-2026-00142"
|
||||
Et un email de confirmation est envoyé:
|
||||
"""
|
||||
Votre appel #MOD-2026-00142 a été reçu.
|
||||
Nous l'examinerons sous 72h maximum.
|
||||
Vous serez notifié de la décision par email et in-app.
|
||||
"""
|
||||
Et le statut de l'appel est "En cours d'examen"
|
||||
Et je peux suivre le statut dans "Mes sanctions"
|
||||
|
||||
Scénario: Délai de soumission de 7 jours maximum
|
||||
Étant donné que j'ai reçu une sanction le 2026-01-15
|
||||
Quand j'essaie de faire appel le 2026-01-25 (10 jours plus tard)
|
||||
Alors le formulaire d'appel est désactivé
|
||||
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
|
||||
|
||||
Scénario: Bouton "Faire appel" visible si délai respecté
|
||||
Étant donné que j'ai reçu une sanction il y a 3 jours
|
||||
Quand je consulte "Mes sanctions"
|
||||
Alors le bouton "Faire appel" est actif
|
||||
Et un compteur indique "4 jours restants pour faire appel"
|
||||
Et je peux cliquer pour soumettre un appel
|
||||
|
||||
# 14.3.4 - Délai de réponse pour appel
|
||||
|
||||
Scénario: SLA de 72h garanti pour appel standard
|
||||
Étant donné que j'ai soumis un appel standard le lundi à 10:00
|
||||
Quand l'appel est en cours de traitement
|
||||
Alors un modérateur senior est assigné
|
||||
Et l'appel doit être traité avant jeudi 10:00 (72h - 3 jours ouvrés)
|
||||
Et je reçois une réponse dans ce délai
|
||||
|
||||
Scénario: Appel complexe avec notification intermédiaire
|
||||
Étant donné que j'ai soumis un appel complexe
|
||||
Et que le traitement nécessite plus de 72h
|
||||
Quand 3 jours se sont écoulés
|
||||
Alors je reçois un email de notification intermédiaire:
|
||||
"""
|
||||
Votre appel #MOD-2026-00142 est en cours d'examen approfondi.
|
||||
Nous vous répondrons sous 2 jours maximum.
|
||||
"""
|
||||
Et l'appel est traité sous 5 jours ouvrés au total
|
||||
Et un modérateur senior + admin modération examinent le cas
|
||||
|
||||
Scénario: Appel CRITIQUE traité en 24h
|
||||
Étant donné que j'ai reçu une suspension longue ou un ban
|
||||
Et que je soumets un appel
|
||||
Quand l'appel est classé en priorité CRITIQUE
|
||||
Alors l'admin modération traite l'appel sous 24h
|
||||
Et je reçois une réponse rapide
|
||||
Et le cas est examiné en priorité absolue
|
||||
|
||||
Scénario: Réponse finale détaillée - Appel accepté
|
||||
Étant donné que mon appel est accepté
|
||||
Quand je reçois la réponse finale
|
||||
Alors l'email contient:
|
||||
| élément | contenu |
|
||||
| Décision | Annulation de la sanction |
|
||||
| Justification | Explication de pourquoi l'appel est accepté |
|
||||
| Actions | Strike retiré, suspension annulée, contenu rétabli |
|
||||
| Définitif | "Cette décision est définitive" |
|
||||
Et le strike est retiré de mon compte
|
||||
Et le contenu est rétabli sur la plateforme
|
||||
Et je peux continuer normalement
|
||||
|
||||
Scénario: Réponse finale détaillée - Appel rejeté
|
||||
Étant donné que mon appel est rejeté
|
||||
Quand je reçois la réponse finale
|
||||
Alors l'email contient:
|
||||
| élément | contenu |
|
||||
| Décision | Maintien de la sanction |
|
||||
| Justification | Explication de pourquoi l'appel est rejeté |
|
||||
| Actions | Sanction maintenue, strike conservé |
|
||||
| Définitif | "Cette décision est définitive" |
|
||||
Et la sanction reste active
|
||||
Et je ne peux pas faire de second appel
|
||||
Et je dois respecter la suspension
|
||||
|
||||
Scénario: Réponse finale - Réduction de sanction
|
||||
Étant donné que mon appel est partiellement accepté
|
||||
Quand je reçois la réponse finale
|
||||
Alors la décision est "Réduction de sanction"
|
||||
Et l'email explique:
|
||||
"""
|
||||
Après examen de votre appel, nous reconnaissons des circonstances atténuantes.
|
||||
La sanction est réduite:
|
||||
- Strike 2 → Strike 1
|
||||
- Suspension 7 jours → Suspension 3 jours
|
||||
|
||||
Cette décision est définitive.
|
||||
"""
|
||||
Et le strike est réduit
|
||||
Et la suspension est raccourcie
|
||||
Et je suis notifié de la nouvelle date de fin
|
||||
|
||||
Scénario: Suivi du statut de l'appel in-app
|
||||
Étant donné que j'ai soumis un appel
|
||||
Quand je consulte "Mes sanctions"
|
||||
Alors je vois le statut actuel de l'appel:
|
||||
| statut | badge | couleur |
|
||||
| En cours d'examen | En cours 🔍 | orange |
|
||||
| Appel accepté | Accepté ✓ | vert |
|
||||
| Appel rejeté | Rejeté ✗ | rouge |
|
||||
| Sanction réduite | Partiellement accepté| bleu |
|
||||
Et une notification badge m'alerte quand le statut change
|
||||
|
||||
# Transparence et traçabilité
|
||||
|
||||
Scénario: Historique complet des sanctions visible
|
||||
Étant donné que je suis un créateur
|
||||
Quand j'ouvre "Profil créateur > Mes sanctions"
|
||||
Alors je vois la liste complète de mes sanctions passées:
|
||||
| colonne | description |
|
||||
| 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 / Accepté / Rejeté |
|
||||
Et les sanctions sont triées par date décroissante
|
||||
|
||||
Scénario: Conformité DSA - Transparence obligatoire
|
||||
Étant donné que le système de sanction est en place
|
||||
Quand un audit DSA est effectué
|
||||
Alors chaque sanction contient:
|
||||
| élément DSA | présent |
|
||||
| Référence précise à la règle violée | oui |
|
||||
| Explication claire et compréhensible | oui |
|
||||
| Preuve (extrait + transcription) | oui |
|
||||
| Possibilité de recours (appel) | oui |
|
||||
| Délai de recours clairement indiqué | oui |
|
||||
| Réponse motivée au recours | oui |
|
||||
Et le système est conforme au Digital Services Act
|
||||
|
||||
# Pas de second appel
|
||||
|
||||
Scénario: Décision définitive après premier appel
|
||||
Étant donné que mon premier appel a été rejeté
|
||||
Quand j'essaie de faire un second appel
|
||||
Alors le bouton "Faire appel" est désactivé
|
||||
Et un message s'affiche: "Cette décision est définitive. Aucun second appel n'est possible."
|
||||
Et je ne peux plus contester la sanction
|
||||
Et je dois respecter la décision finale
|
||||
|
||||
# Coût des notifications
|
||||
|
||||
Scénario: Coût des notifications multi-canal
|
||||
Étant donné que 100 sanctions sont appliquées en un mois
|
||||
Quand on calcule le coût des notifications
|
||||
Alors le coût total est d'environ 0.10€:
|
||||
| canal | coût unitaire | coût pour 100 |
|
||||
| Email | 0.001€ | 0.10€ |
|
||||
| Push | 0€ | 0€ |
|
||||
| In-app | 0€ | 0€ |
|
||||
Et le coût est négligeable même à grande échelle
|
||||
Reference in New Issue
Block a user