feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024
Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture. ## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU) - Créer structure features/{api,ui,e2e} - Déplacer 83 features en 3 catégories via git mv (historique préservé) - features/api/ : 53 features (tests API backend) - features/ui/ : 22 features (tests UI mobile) - features/e2e/ : 8 features (tests end-to-end) Domaines déplacés : - API : authentication, recommendation, rgpd-compliance, content-creation, moderation, monetisation, premium, radio-live, publicites - UI : audio-guides, navigation, interest-gauges, mode-offline, partage, profil, recherche - E2E : abonnements, error-handling ## Phase 2 : Mise à jour Documentation ### ADR-007 - Tests BDD - Ajouter section "Convention de Catégorisation des Features" - Documenter règles api/ui/e2e avec exemples concrets - Spécifier step definitions (backend Go, mobile Dart) ### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU) - Créer ADR dédié pour stratégie CI/CD avec path filters - Architecture workflows séparés (backend.yml, mobile.yml, shared.yml) - Configuration path filters détaillée avec exemples YAML - Matrice de déclenchement et optimisations (~70% gain temps CI) - Plan d'implémentation (~2h, reporté jusqu'au développement) ### ADR-016 - Organisation Monorepo - Simplifier en retirant section CI/CD détaillée - Ajouter référence vers ADR-024 pour stratégie CI/CD ### INCONSISTENCIES-ANALYSIS.md - Point #10 (Tests BDD synchronisés) : ✅ RÉSOLU - Catégorisation features implémentée - ADR-007 mis à jour avec convention complète - Point #11 (70/30 Split paiements) : ✅ ANNULÉ (faux problème) - ADR-009 et Règle 18 parfaitement cohérents - Documentation exhaustive existante (formule, SQL, comparaisons) - Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ - Architecture CI/CD complète dans ADR-024 - Implémentation reportée (projet en phase documentation) - Métriques mises à jour : - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté) - ADR à jour : 100% (19/19 avec ADR-024) ## Phase 3 : Validation - Structure features validée (api/ui/e2e, aucun répertoire restant) - Historique Git préservé (git mv, renommages détectés) - 83 features total (API: 53, UI: 22, E2E: 8) Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
284
features/api/moderation/moderation-preventive.feature
Normal file
284
features/api/moderation/moderation-preventive.feature
Normal file
@@ -0,0 +1,284 @@
|
||||
# language: fr
|
||||
|
||||
@moderation @preventive
|
||||
Fonctionnalité: Modération préventive
|
||||
|
||||
# 14.5 - Modération préventive (rappel)
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de modération préventive est actif
|
||||
|
||||
# Nouveaux créateurs - Validation manuelle des 3 premiers contenus
|
||||
|
||||
Scénario: Créateur nouvellement inscrit
|
||||
Étant donné que je viens de créer un compte créateur
|
||||
Et que je n'ai jamais publié de contenu
|
||||
Quand j'examine mon statut de créateur
|
||||
Alors mon compte est marqué comme "Nouveau créateur"
|
||||
Et mes 3 premiers contenus devront être validés manuellement
|
||||
Et je suis informé de ce processus lors de l'onboarding
|
||||
|
||||
Scénario: Publication du premier contenu par un nouveau créateur
|
||||
Étant donné que je suis un nouveau créateur
|
||||
Et que je n'ai publié aucun contenu auparavant
|
||||
Quand je publie mon premier contenu
|
||||
Alors le contenu entre en file d'attente de validation manuelle
|
||||
Et le statut du contenu est "En attente de validation"
|
||||
Et le contenu n'est pas diffusé sur la plateforme
|
||||
Et je reçois une notification:
|
||||
"""
|
||||
Votre contenu est en cours de validation.
|
||||
Les premiers contenus sont vérifiés manuellement pour garantir la qualité de la plateforme.
|
||||
Délai: 24-48h (jours ouvrés).
|
||||
"""
|
||||
|
||||
Scénario: Validation manuelle par un modérateur
|
||||
Étant donné que j'ai publié mon premier contenu
|
||||
Et que le contenu est en attente de validation
|
||||
Quand un modérateur examine mon contenu
|
||||
Alors le modérateur utilise la transcription automatique Whisper
|
||||
Et le modérateur vérifie:
|
||||
| critère | conforme |
|
||||
| Respect des règles communauté | oui |
|
||||
| Pas de contenu inapproprié | oui |
|
||||
| Qualité audio acceptable | oui |
|
||||
| Métadonnées cohérentes | oui |
|
||||
| Tags appropriés | oui |
|
||||
Et si tout est conforme, le contenu est validé
|
||||
|
||||
Scénario: Délai de validation de 24-48h jours ouvrés
|
||||
Étant donné que j'ai publié mon premier contenu lundi à 10:00
|
||||
Quand le contenu entre en file de validation
|
||||
Alors le contenu est validé avant mercredi 10:00 (48h jours ouvrés)
|
||||
Et dans la plupart des cas, la validation est effectuée sous 24h
|
||||
Et je reçois une notification dès que le contenu est validé
|
||||
|
||||
Scénario: Notification de validation réussie
|
||||
Étant donné que mon premier contenu a été validé par un modérateur
|
||||
Quand la validation est approuvée
|
||||
Alors je reçois une notification:
|
||||
"""
|
||||
✓ Votre contenu "Mon premier podcast" a été validé!
|
||||
Il est maintenant diffusé sur RoadWave.
|
||||
"""
|
||||
Et le statut du contenu passe à "Publié"
|
||||
Et le contenu devient visible pour tous les utilisateurs
|
||||
Et il entre dans l'algorithme de recommandation
|
||||
|
||||
Scénario: Refus de validation si contenu non conforme
|
||||
Étant donné que mon premier contenu viole les règles de la communauté
|
||||
Quand le modérateur examine le contenu
|
||||
Alors le contenu est refusé
|
||||
Et je reçois une notification détaillée:
|
||||
"""
|
||||
⚠️ Votre contenu "Mon premier podcast" n'a pas été validé.
|
||||
|
||||
Raison: Contenu inapproprié détecté
|
||||
Passage problématique: 3:15-3:45
|
||||
Transcription: "[passage surligné]"
|
||||
|
||||
Que faire?
|
||||
- Corrigez le problème et republiez
|
||||
- Consultez les règles de la communauté
|
||||
- Contactez le support si vous avez des questions
|
||||
"""
|
||||
Et le contenu reste en statut "Refusé"
|
||||
Et je peux modifier et republier
|
||||
|
||||
Scénario: Les 3 premiers contenus sont validés manuellement
|
||||
Étant donné que je suis un nouveau créateur
|
||||
Quand je publie mes contenus
|
||||
Alors les contenus suivants nécessitent une validation manuelle:
|
||||
| contenu | validation manuelle |
|
||||
| 1er | oui |
|
||||
| 2ème | oui |
|
||||
| 3ème | oui |
|
||||
| 4ème | non (auto) |
|
||||
Et après 3 contenus validés, mes futurs contenus sont publiés automatiquement
|
||||
|
||||
Scénario: Passage en mode automatique après 3 validations
|
||||
Étant donné que mes 3 premiers contenus ont été validés avec succès
|
||||
Quand je publie mon 4ème contenu
|
||||
Alors le contenu est publié automatiquement
|
||||
Et aucune validation manuelle n'est requise
|
||||
Et le statut passe directement à "Publié"
|
||||
Et je reçois une notification:
|
||||
"""
|
||||
✓ Votre contenu a été publié automatiquement.
|
||||
Vos 3 premiers contenus ayant été conformes, vos futurs contenus sont publiés instantanément.
|
||||
"""
|
||||
|
||||
# Score de confiance dynamique
|
||||
|
||||
Scénario: Évolution du score de confiance
|
||||
Étant donné que je suis un créateur établi
|
||||
Quand le système évalue mon historique
|
||||
Alors un score de confiance est calculé basé sur:
|
||||
| critère | poids |
|
||||
| Nombre de contenus publiés | 20% |
|
||||
| Strikes reçus | 40% |
|
||||
| Signalements infondés | 20% |
|
||||
| Ancienneté du compte | 10% |
|
||||
| Taux d'engagement positif | 10% |
|
||||
Et le score évolue dynamiquement
|
||||
|
||||
Scénario: Créateur fiable - Publication automatique
|
||||
Étant donné que je suis un créateur
|
||||
Et que j'ai 0 strike depuis 6 mois
|
||||
Et que tous mes contenus précédents ont été conformes
|
||||
Quand mon score de confiance est calculé
|
||||
Alors je suis classé comme "Créateur fiable"
|
||||
Et tous mes nouveaux contenus sont publiés automatiquement
|
||||
Et aucune validation manuelle n'est nécessaire
|
||||
Et je bénéficie d'une publication instantanée
|
||||
|
||||
Scénario: Créateur suspect - Validation manuelle systématique
|
||||
Étant donné que je suis un créateur
|
||||
Et que j'ai reçu 2 strikes récents (< 3 mois)
|
||||
Quand mon score de confiance est recalculé
|
||||
Alors je suis classé comme "Créateur suspect"
|
||||
Et tous mes nouveaux contenus nécessitent une validation manuelle
|
||||
Et chaque contenu est examiné avant publication
|
||||
Et je suis notifié de ce changement de statut:
|
||||
"""
|
||||
En raison de sanctions récentes, vos contenus nécessitent une validation manuelle.
|
||||
Respectez les règles de la communauté pour retrouver la publication automatique.
|
||||
"""
|
||||
|
||||
Scénario: Réhabilitation après période sans incident
|
||||
Étant donné que j'étais un "Créateur suspect"
|
||||
Et que je publie 10 contenus conformes sur 6 mois
|
||||
Et que je ne reçois aucun nouveau strike
|
||||
Quand le système réévalue mon score de confiance
|
||||
Alors je passe en "Créateur fiable"
|
||||
Et la publication automatique est rétablie
|
||||
Et je reçois une notification de réhabilitation:
|
||||
"""
|
||||
✓ Félicitations! Vous êtes de nouveau un créateur fiable.
|
||||
Vos contenus seront publiés automatiquement.
|
||||
"""
|
||||
|
||||
# Publicités - Validation manuelle obligatoire
|
||||
|
||||
Scénario: Toute publicité nécessite validation manuelle
|
||||
Étant donné qu'un annonceur soumet une publicité audio
|
||||
Quand la publicité est créée
|
||||
Alors elle entre automatiquement en file de validation manuelle
|
||||
Et aucune publicité n'est diffusée sans validation préalable
|
||||
Et cela est obligatoire pour des raisons de responsabilité juridique
|
||||
|
||||
Scénario: Validation d'une publicité - Processus complet
|
||||
Étant donné qu'une publicité est en attente de validation
|
||||
Quand un modérateur senior examine la publicité
|
||||
Alors le modérateur vérifie:
|
||||
| critère | conforme |
|
||||
| Transcription automatique Whisper | effectuée|
|
||||
| Contenu conforme aux règles | oui |
|
||||
| Pas de fausse publicité / arnaque | oui |
|
||||
| Respect du ciblage géographique | oui |
|
||||
| Durée conforme (10-60s) | oui |
|
||||
| Volume audio acceptable (pas trop fort)| oui |
|
||||
| Métadonnées correctes | oui |
|
||||
Et si tout est conforme, la publicité est validée
|
||||
|
||||
Scénario: Délai de validation d'une publicité - 24-48h
|
||||
Étant donné qu'un annonceur soumet une publicité lundi à 10:00
|
||||
Quand la publicité entre en file de validation
|
||||
Alors la publicité est validée avant mercredi 10:00 (48h jours ouvrés)
|
||||
Et l'annonceur est notifié dès la validation
|
||||
Et la campagne publicitaire peut alors démarrer
|
||||
|
||||
Scénario: Refus de validation d'une publicité
|
||||
Étant donné qu'une publicité contient des éléments non conformes
|
||||
Quand le modérateur examine la publicité
|
||||
Alors la publicité est refusée
|
||||
Et l'annonceur reçoit une notification détaillée:
|
||||
"""
|
||||
⚠️ Votre publicité n'a pas été validée.
|
||||
|
||||
Raison: Contenu trompeur détecté
|
||||
Passage problématique: 0:15-0:25
|
||||
Transcription: "[promesse irréaliste surlignée]"
|
||||
|
||||
Que faire?
|
||||
- Modifiez votre publicité
|
||||
- Soumettez-la à nouveau pour validation
|
||||
- Consultez les règles publicitaires de RoadWave
|
||||
"""
|
||||
Et l'annonceur peut modifier et resoumettre la publicité
|
||||
Et aucun remboursement n'est effectué pour une publicité refusée
|
||||
|
||||
# Prévention > Réaction
|
||||
|
||||
Scénario: Économie de modération grâce à la prévention
|
||||
Étant donné que la modération préventive est active
|
||||
Quand on analyse l'efficacité du système
|
||||
Alors 80% des contenus inappropriés sont détectés avant publication
|
||||
Et cela réduit le nombre de signalements de 70%
|
||||
Et les ressources de modération sont optimisées
|
||||
Et la qualité de la plateforme est préservée dès le début
|
||||
|
||||
Scénario: Qualité de la plateforme maintenue
|
||||
Étant donné que tous les nouveaux créateurs sont vérifiés
|
||||
Quand on analyse la qualité globale des contenus
|
||||
Alors le taux de contenus inappropriés est <1%
|
||||
Et les utilisateurs font confiance à la plateforme
|
||||
Et la réputation de RoadWave est préservée
|
||||
Et l'expérience utilisateur est optimale
|
||||
|
||||
# Transparence envers les créateurs
|
||||
|
||||
Scénario: Information claire sur le processus de validation
|
||||
Étant donné que je suis un nouveau créateur
|
||||
Quand je consulte la page d'aide "Validation des contenus"
|
||||
Alors j'apprends que:
|
||||
"""
|
||||
Validation des contenus
|
||||
|
||||
Nouveaux créateurs:
|
||||
- Vos 3 premiers contenus sont validés manuellement
|
||||
- Délai: 24-48h (jours ouvrés)
|
||||
- Après 3 contenus conformes: publication automatique
|
||||
|
||||
Créateurs établis:
|
||||
- Publication automatique si historique conforme
|
||||
- Validation manuelle si strikes récents
|
||||
|
||||
Publicités:
|
||||
- Validation manuelle obligatoire pour toutes les publicités
|
||||
- Délai: 24-48h (jours ouvrés)
|
||||
"""
|
||||
Et le processus est clair et transparent
|
||||
|
||||
Scénario: Badge "Créateur vérifié" après validation
|
||||
Étant donné que mes 3 premiers contenus ont été validés avec succès
|
||||
Quand je consulte mon profil créateur
|
||||
Alors un badge discret "✓ Créateur vérifié" s'affiche
|
||||
Et ce badge rassure les auditeurs sur la qualité de mes contenus
|
||||
Et il améliore ma crédibilité sur la plateforme
|
||||
|
||||
# Conformité et justification
|
||||
|
||||
Scénario: Justification de la modération préventive
|
||||
Étant donné que la modération préventive est en place
|
||||
Quand on évalue les bénéfices
|
||||
Alors les avantages suivants sont constatés:
|
||||
| bénéfice |
|
||||
| Prévention meilleure que réaction |
|
||||
| Économie de ressources de modération (×3-5) |
|
||||
| Qualité de la plateforme préservée dès le début |
|
||||
| Confiance des utilisateurs renforcée |
|
||||
| Moins de contenus inappropriés signalés |
|
||||
| Réputation de la plateforme protégée |
|
||||
Et l'investissement dans la prévention est rentable
|
||||
|
||||
Scénario: Coût de la modération préventive
|
||||
Étant donné que 100 nouveaux créateurs publient 3 contenus chacun
|
||||
Et que 50 publicités sont soumises par mois
|
||||
Quand on calcule le coût de modération préventive
|
||||
Alors le coût en temps modérateur est:
|
||||
| type | nombre | temps/contenu | total |
|
||||
| Nouveaux créateurs| 300 | 5 min | 25h |
|
||||
| Publicités | 50 | 10 min | 8.3h |
|
||||
Et le coût total est d'environ 33h de modération/mois
|
||||
Et c'est largement compensé par la réduction des signalements réactifs
|
||||
327
features/api/moderation/sanctions-notifications.feature
Normal file
327
features/api/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
|
||||
224
features/api/moderation/signalement.feature
Normal file
224
features/api/moderation/signalement.feature
Normal file
@@ -0,0 +1,224 @@
|
||||
# language: fr
|
||||
|
||||
@moderation @reporting
|
||||
Fonctionnalité: Signalement de contenu inapproprié
|
||||
|
||||
# 14.1 - Signalement utilisateur
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que je suis en train d'écouter un contenu
|
||||
|
||||
# 14.1.1 - Catégories de signalement
|
||||
|
||||
Scénario: Affichage du formulaire de signalement
|
||||
Étant donné que j'écoute un contenu inapproprié
|
||||
Quand j'ouvre le menu du contenu
|
||||
Et que je clique sur "Signaler"
|
||||
Alors un formulaire de signalement s'affiche
|
||||
Et le formulaire contient une liste déroulante "Catégorie du problème"
|
||||
Et le formulaire contient un champ texte "Commentaire (optionnel)"
|
||||
Et le formulaire contient un bouton "Envoyer le signalement"
|
||||
|
||||
Scénario: Liste des 7 catégories prédéfinies
|
||||
Étant donné que le formulaire de signalement est affiché
|
||||
Quand je clique sur la liste déroulante "Catégorie du problème"
|
||||
Alors je vois les 7 catégories suivantes:
|
||||
| icône | catégorie | description |
|
||||
| 🚫 | Haine & violence | Incitation à la haine, discrimination, menaces |
|
||||
| 🔞 | Contenu sexuel | Pornographie, contenu explicite |
|
||||
| ⚖️ | Illégalité | Terrorisme, apologie de crimes |
|
||||
| 🎵 | Droits d'auteur | Musique/contenu protégé non autorisé |
|
||||
| 📧 | Spam | Publicité non sollicitée, répétition |
|
||||
| ❌ | Fausse information | Désinformation sur santé, sécurité routière |
|
||||
| 🔧 | Autre | Champ texte obligatoire si sélectionné |
|
||||
Et chaque catégorie a une description claire
|
||||
|
||||
Scénario: Sélection de la catégorie "Haine & violence"
|
||||
Étant donné que le formulaire de signalement est affiché
|
||||
Quand je sélectionne la catégorie "🚫 Haine & violence"
|
||||
Alors la catégorie est sélectionnée
|
||||
Et la description "Incitation à la haine, discrimination, menaces" s'affiche
|
||||
Et je peux passer au champ commentaire
|
||||
|
||||
Scénario: Catégorie "Autre" nécessite un commentaire obligatoire
|
||||
Étant donné que le formulaire de signalement est affiché
|
||||
Quand je sélectionne la catégorie "🔧 Autre"
|
||||
Alors le champ "Commentaire" devient obligatoire
|
||||
Et un message s'affiche: "Veuillez décrire le problème (obligatoire)"
|
||||
Et le placeholder change en "Décrivez le problème rencontré"
|
||||
Et je ne peux pas envoyer le signalement sans commentaire
|
||||
|
||||
# 14.1.2 - Commentaire du signaleur
|
||||
|
||||
Scénario: Champ commentaire optionnel avec incitation
|
||||
Étant donné que le formulaire de signalement est affiché
|
||||
Et que j'ai sélectionné une catégorie autre que "Autre"
|
||||
Quand je consulte le champ "Commentaire"
|
||||
Alors le champ est optionnel (pas d'astérisque rouge)
|
||||
Et le placeholder indique "Décrivez le problème (optionnel mais recommandé)"
|
||||
Et la limite de caractères est de 500
|
||||
Et un compteur affiche "0/500"
|
||||
|
||||
Scénario: Envoi de signalement sans commentaire
|
||||
Étant donné que j'ai sélectionné la catégorie "📧 Spam"
|
||||
Et que je n'ai pas rempli le champ commentaire
|
||||
Quand je clique sur "Envoyer le signalement"
|
||||
Alors le signalement est envoyé avec succès
|
||||
Et aucune erreur de validation ne s'affiche
|
||||
Et le commentaire est enregistré comme vide
|
||||
|
||||
Scénario: Envoi de signalement avec commentaire
|
||||
Étant donné que j'ai sélectionné la catégorie "🚫 Haine & violence"
|
||||
Et que j'ai saisi le commentaire "Le créateur tient des propos discriminatoires à 2:30"
|
||||
Quand je clique sur "Envoyer le signalement"
|
||||
Alors le signalement est envoyé avec succès
|
||||
Et le commentaire est enregistré avec le signalement
|
||||
Et il sera visible par les modérateurs
|
||||
|
||||
Scénario: Limite de 500 caractères pour le commentaire
|
||||
Étant donné que le formulaire de signalement est affiché
|
||||
Quand je saisis un commentaire de 501 caractères
|
||||
Alors le champ limite automatiquement à 500 caractères
|
||||
Et le compteur affiche "500/500"
|
||||
Et les caractères supplémentaires ne sont pas acceptés
|
||||
|
||||
# 14.1.3 - Confirmation après signalement
|
||||
|
||||
Scénario: Toast de confirmation après signalement
|
||||
Étant donné que j'ai envoyé un signalement
|
||||
Quand le signalement est enregistré
|
||||
Alors un toast notification s'affiche
|
||||
Et le toast contient le message "✓ Signalement envoyé. Nous l'examinerons sous 24-48h."
|
||||
Et le toast s'affiche pendant 5 secondes
|
||||
Et le toast contient un bouton "Voir mes signalements"
|
||||
Et je peux fermer le toast manuellement avec un bouton X
|
||||
|
||||
Scénario: Accès à l'historique des signalements via le toast
|
||||
Étant donné que le toast de confirmation est affiché
|
||||
Quand je clique sur "Voir mes signalements"
|
||||
Alors je suis redirigé vers la page "Mes signalements"
|
||||
Et je vois la liste de tous mes signalements
|
||||
Et le signalement que je viens d'envoyer apparaît en premier
|
||||
|
||||
Scénario: Historique personnel des signalements
|
||||
Étant donné que j'ai envoyé 3 signalements précédemment
|
||||
Quand j'ouvre "Profil > Mes signalements"
|
||||
Alors je vois la liste de mes 3 signalements
|
||||
Et chaque signalement affiche:
|
||||
| information | description |
|
||||
| Titre du contenu | "Podcast #42" |
|
||||
| Créateur | @pseudo_createur |
|
||||
| Catégorie | 🚫 Haine & violence |
|
||||
| Date | 15/01/2026 |
|
||||
| Statut | En cours / Traité / Rejeté |
|
||||
| Mon commentaire | Texte que j'ai saisi |
|
||||
Et les signalements sont triés par date décroissante
|
||||
|
||||
Plan du Scénario: Statuts possibles d'un signalement
|
||||
Étant donné que j'ai envoyé un signalement
|
||||
Quand le statut du signalement est "<statut>"
|
||||
Alors le badge affiché est "<badge>"
|
||||
Et la couleur du badge est "<couleur>"
|
||||
|
||||
Exemples:
|
||||
| statut | badge | couleur |
|
||||
| En cours | En cours | orange |
|
||||
| Traité | Traité ✓ | vert |
|
||||
| Rejeté | Rejeté ✗ | rouge |
|
||||
|
||||
Scénario: Notification in-app si action prise
|
||||
Étant donné que j'ai signalé un contenu il y a 24h
|
||||
Quand le modérateur traite mon signalement
|
||||
Et que le contenu est effectivement retiré
|
||||
Alors je reçois une notification in-app
|
||||
Et la notification indique "Votre signalement a été traité. Le contenu a été retiré."
|
||||
Et le statut de mon signalement passe à "Traité ✓"
|
||||
Et je peux voir les détails de l'action prise
|
||||
|
||||
Scénario: Notification si signalement rejeté
|
||||
Étant donné que j'ai signalé un contenu
|
||||
Quand le modérateur rejette mon signalement
|
||||
Alors je reçois une notification in-app
|
||||
Et la notification indique "Votre signalement a été examiné. Le contenu ne viole pas les règles de la communauté."
|
||||
Et le statut de mon signalement passe à "Rejeté ✗"
|
||||
Et je peux voir la raison du rejet
|
||||
|
||||
# Signalements multiples du même contenu
|
||||
|
||||
Scénario: Un contenu peut être signalé plusieurs fois
|
||||
Étant donné qu'un contenu a déjà été signalé par 5 autres utilisateurs
|
||||
Quand je signale le même contenu
|
||||
Alors mon signalement est enregistré indépendamment
|
||||
Et le compteur de signalements du contenu passe à 6
|
||||
Et mon signalement rejoint la file d'attente de modération
|
||||
Et les signalements cumulés augmentent la priorité de traitement
|
||||
|
||||
Scénario: Limite de signalements par utilisateur
|
||||
Étant donné que j'ai déjà signalé le même contenu il y a 2 jours
|
||||
Quand j'essaie de signaler à nouveau le même contenu
|
||||
Alors un message m'informe "Vous avez déjà signalé ce contenu"
|
||||
Et le formulaire de signalement n'est pas affiché
|
||||
Et je peux consulter le statut de mon signalement précédent
|
||||
|
||||
# Signalements abusifs
|
||||
|
||||
Scénario: Détection de signalements abusifs répétés
|
||||
Étant donné que j'ai envoyé 10 signalements ce mois-ci
|
||||
Et que 8 d'entre eux ont été rejetés comme infondés
|
||||
Quand j'essaie d'envoyer un nouveau signalement
|
||||
Alors mon compte est marqué comme "signaleur suspect"
|
||||
Et un avertissement s'affiche:
|
||||
"""
|
||||
Attention: vos signalements récents ont été majoritairement rejetés.
|
||||
Les signalements abusifs peuvent entraîner des sanctions.
|
||||
"""
|
||||
Et je peux toujours envoyer le signalement
|
||||
Mais mes futurs signalements auront une priorité réduite
|
||||
|
||||
Scénario: Sanction pour signalements abusifs graves
|
||||
Étant donné que j'ai envoyé 20 signalements abusifs en 1 mois
|
||||
Et que tous ont été rejetés comme volontairement faux
|
||||
Quand le modérateur détecte le pattern abusif
|
||||
Alors mon compte reçoit un avertissement formel
|
||||
Et je perds la possibilité de signaler pendant 30 jours
|
||||
Et je reçois un email m'expliquant la sanction
|
||||
|
||||
# Signalement depuis différents points de l'app
|
||||
|
||||
Scénario: Signalement depuis le player audio
|
||||
Étant donné que j'écoute un contenu
|
||||
Quand j'ouvre le menu "⋮" du player
|
||||
Alors je vois l'option "Signaler"
|
||||
Et je peux ouvrir le formulaire de signalement
|
||||
|
||||
Scénario: Signalement depuis la page de détails du contenu
|
||||
Étant donné que je consulte la page de détails d'un contenu
|
||||
Quand je clique sur le bouton "⋮" en haut à droite
|
||||
Alors je vois l'option "Signaler"
|
||||
Et je peux ouvrir le formulaire de signalement
|
||||
|
||||
Scénario: Signalement depuis l'historique d'écoute
|
||||
Étant donné que je consulte mon historique d'écoute
|
||||
Quand je clique sur "⋮" à côté d'un contenu passé
|
||||
Alors je vois l'option "Signaler"
|
||||
Et je peux signaler ce contenu même si je ne l'écoute plus actuellement
|
||||
|
||||
# Anonymat du signaleur
|
||||
|
||||
Scénario: Identité du signaleur anonyme pour le créateur
|
||||
Étant donné que j'ai signalé un contenu
|
||||
Quand le créateur est notifié de la modération
|
||||
Alors mon identité reste anonyme
|
||||
Et le créateur ne peut pas savoir qui a signalé
|
||||
Et seuls les modérateurs ont accès à l'identité du signaleur
|
||||
|
||||
# Coût de la solution
|
||||
|
||||
Scénario: Coût du système de signalement
|
||||
Étant donné que le système de signalement est en place
|
||||
Quand on calcule le coût
|
||||
Alors le coût est de 0€
|
||||
Et le formulaire est développé en interne
|
||||
Et aucun service tiers n'est utilisé
|
||||
Et les notifications in-app sont gratuites
|
||||
268
features/api/moderation/traitement-signalements.feature
Normal file
268
features/api/moderation/traitement-signalements.feature
Normal file
@@ -0,0 +1,268 @@
|
||||
# language: fr
|
||||
|
||||
@moderation @processing
|
||||
Fonctionnalité: Traitement des signalements par l'IA et les modérateurs
|
||||
|
||||
# 14.2 - Traitement des signalements
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de modération est actif
|
||||
|
||||
# 14.2.1 - IA pré-filtre (Whisper + NLP)
|
||||
|
||||
Scénario: Signalement ajouté à la file d'attente asynchrone
|
||||
Étant donné qu'un utilisateur envoie un signalement pour un contenu audio
|
||||
Quand le signalement est reçu
|
||||
Alors le signalement est ajouté à la file d'attente asynchrone
|
||||
Et un worker de traitement est déclenché
|
||||
Et le traitement se fait en arrière-plan sans bloquer l'utilisateur
|
||||
|
||||
Scénario: Transcription automatique avec Whisper large-v3
|
||||
Étant donné qu'un contenu audio signalé dure 5 minutes
|
||||
Quand le worker de traitement démarre
|
||||
Alors le système utilise Whisper large-v3 pour transcrire l'audio
|
||||
Et la transcription est en self-hosted (pas de service cloud)
|
||||
Et le texte transcrit est enregistré en base de données
|
||||
Et le délai de transcription est de 1-3 minutes
|
||||
|
||||
Plan du Scénario: Délai de transcription selon durée audio
|
||||
Étant donné qu'un contenu audio signalé dure <duree> minutes
|
||||
Quand le système transcrit l'audio
|
||||
Alors la transcription prend environ <delai>
|
||||
|
||||
Exemples:
|
||||
| duree | delai |
|
||||
| 2 | 1-3 minutes |
|
||||
| 10 | 3-10 minutes |
|
||||
| 45 | 10-20 minutes |
|
||||
|
||||
Scénario: Analyse automatique du contenu transcrit
|
||||
Étant donné que la transcription audio est terminée
|
||||
Quand le système analyse le texte transcrit
|
||||
Alors les analyses suivantes sont effectuées:
|
||||
| analyse | technologie |
|
||||
| Analyse de sentiment | distilbert-base-uncased |
|
||||
| Détection de haine | facebook/roberta-hate-speech |
|
||||
| Mots-clés interdits | Liste noire FR/EN + regex |
|
||||
Et chaque analyse génère un score de confiance (0-100%)
|
||||
|
||||
Scénario: Génération du score de confiance IA
|
||||
Étant donné que toutes les analyses sont terminées
|
||||
Quand le système calcule le score final
|
||||
Alors un score de confiance IA entre 0-100% est généré
|
||||
Et le score indique la probabilité que le contenu viole les règles
|
||||
Et la catégorie la plus probable est identifiée
|
||||
Et les timestamps des passages problématiques sont extraits
|
||||
|
||||
Scénario: Détection automatique de contenu clairement inapproprié
|
||||
Étant donné qu'un contenu contient des insultes graves et répétées
|
||||
Quand l'IA analyse la transcription
|
||||
Alors le score de confiance IA est >95%
|
||||
Et la catégorie détectée est "Haine & violence"
|
||||
Et les passages problématiques sont identifiés avec timestamps:
|
||||
| timestamp | texte problématique |
|
||||
| 02:15 | [insulte discriminatoire] |
|
||||
| 03:42 | [propos haineux] |
|
||||
Et le signalement est classé en priorité CRITIQUE
|
||||
|
||||
# 14.2.2 - Délais de traitement (SLA)
|
||||
|
||||
Plan du Scénario: SLA selon priorité du signalement
|
||||
Étant donné qu'un signalement a une priorité "<priorite>"
|
||||
Quand le signalement entre en file d'attente
|
||||
Alors le délai de traitement cible est "<delai>"
|
||||
Et le responsable du traitement est "<responsable>"
|
||||
|
||||
Exemples:
|
||||
| priorite | delai | responsable |
|
||||
| CRITIQUE | <2h (24/7) | Modérateur senior (astreinte) |
|
||||
| HAUTE | <24h (jours ouvrés) | Modérateur junior/senior |
|
||||
| MOYENNE | <24h (jours ouvrés) | Modérateur junior |
|
||||
| BASSE | <72h (jours ouvrés) | Modérateur junior |
|
||||
|
||||
Scénario: Traitement automatique pour score IA >95%
|
||||
Étant donné qu'un signalement a un score IA de 97%
|
||||
Et que la catégorie détectée est "Spam" (évidente)
|
||||
Quand le système évalue le signalement
|
||||
Alors une action automatique immédiate est déclenchée
|
||||
Et le contenu est retiré automatiquement
|
||||
Et le créateur est notifié de la modération
|
||||
Et le créateur peut faire appel de la décision
|
||||
Et un modérateur senior vérifie l'action a posteriori
|
||||
|
||||
Scénario: Signalement CRITIQUE traité en moins de 2h
|
||||
Étant donné qu'un signalement de priorité CRITIQUE est reçu à 14:00
|
||||
Et que le contenu concerne une menace de violence
|
||||
Quand le signalement est assigné à un modérateur senior d'astreinte
|
||||
Alors le modérateur est alerté immédiatement (push + SMS)
|
||||
Et le signalement est traité avant 16:00 (2h)
|
||||
Et une décision est prise et appliquée
|
||||
Et les autorités peuvent être contactées si nécessaire
|
||||
|
||||
Scénario: Astreinte modérateur 24/7 pour signalements CRITIQUES
|
||||
Étant donné qu'un signalement CRITIQUE est reçu un dimanche à 03:00
|
||||
Quand le signalement est classé en priorité CRITIQUE
|
||||
Alors le modérateur senior d'astreinte est alerté
|
||||
Et le signalement est traité dans les 2h (avant 05:00)
|
||||
Et le service d'astreinte garantit une disponibilité 24/7
|
||||
|
||||
Scénario: Signalement HAUTE priorité traité en moins de 24h
|
||||
Étant donné qu'un signalement de priorité HAUTE est reçu lundi à 10:00
|
||||
Et que le contenu concerne du harcèlement
|
||||
Quand le signalement entre en file d'attente
|
||||
Alors le signalement est assigné à un modérateur (junior ou senior)
|
||||
Et le signalement est traité avant mardi 10:00 (24h jours ouvrés)
|
||||
Et une décision est prise et appliquée
|
||||
|
||||
Scénario: Signalement BASSE priorité traité en moins de 72h
|
||||
Étant donné qu'un signalement de priorité BASSE est reçu lundi à 10:00
|
||||
Et que le contenu concerne des tags incorrects
|
||||
Quand le signalement entre en file d'attente
|
||||
Alors le signalement est traité avant jeudi 10:00 (72h jours ouvrés)
|
||||
Et un modérateur junior peut traiter ce type de signalement
|
||||
|
||||
# 14.2.3 - Priorisation automatique
|
||||
|
||||
Scénario: Calcul du score de priorité
|
||||
Étant donné qu'un signalement a les caractéristiques suivantes:
|
||||
| caractéristique | valeur |
|
||||
| Score IA | 85% |
|
||||
| Signalements cumulés | 3 |
|
||||
| Fiabilité du signaleur | 75% |
|
||||
Quand le système calcule la priorité
|
||||
Alors la formule appliquée est:
|
||||
"""
|
||||
Priorité = (Score_IA × 0.7) + (Signalements_cumulés × 0.2) + (Fiabilité_signaleur × 0.1)
|
||||
"""
|
||||
Et le score de priorité est: (85 × 0.7) + (3 × 0.2) + (75 × 0.1) = 67.5
|
||||
Et le signalement est classé en priorité MOYENNE
|
||||
|
||||
Plan du Scénario: Classification selon score de priorité
|
||||
Étant donné qu'un signalement a un score de priorité de <score>
|
||||
Quand le système classe le signalement
|
||||
Alors la priorité assignée est "<priorite>"
|
||||
Et le signalement entre dans la file "<file>"
|
||||
|
||||
Exemples:
|
||||
| score | priorite | file |
|
||||
| 95 | CRITIQUE | Immédiate |
|
||||
| 82 | HAUTE | Prioritaire |
|
||||
| 55 | MOYENNE | Normale |
|
||||
| 25 | BASSE | Différée |
|
||||
|
||||
Scénario: Boost de priorité avec signalements cumulés
|
||||
Étant donné qu'un contenu a été signalé par 1 utilisateur avec un score IA de 60%
|
||||
Et que le signalement est classé en priorité MOYENNE (score 42)
|
||||
Quand 5 autres utilisateurs signalent le même contenu
|
||||
Alors le nombre de signalements cumulés passe à 6
|
||||
Et le score de priorité augmente significativement
|
||||
Et le signalement peut passer en priorité HAUTE
|
||||
Et le traitement est accéléré
|
||||
|
||||
Scénario: Impact de la fiabilité du signaleur
|
||||
Étant donné qu'un utilisateur de confiance (90% fiabilité) envoie un signalement
|
||||
Et qu'un utilisateur suspect (20% fiabilité) envoie un signalement similaire
|
||||
Quand le système calcule les priorités
|
||||
Alors le signalement de l'utilisateur de confiance a un score plus élevé
|
||||
Et son signalement est traité en priorité
|
||||
Et le signalement de l'utilisateur suspect est traité plus tard
|
||||
|
||||
Scénario: Évolution du score de fiabilité du signaleur
|
||||
Étant donné qu'un utilisateur a envoyé 10 signalements
|
||||
Et que 8 d'entre eux ont été acceptés par les modérateurs
|
||||
Quand le système calcule son score de fiabilité
|
||||
Alors le score est de 80% (8 acceptés / 10 total)
|
||||
Et ses futurs signalements auront plus de poids
|
||||
Et il peut devenir "utilisateur de confiance"
|
||||
|
||||
# File d'attente intelligente
|
||||
|
||||
Scénario: Files d'attente séparées par priorité
|
||||
Étant donné que 50 signalements sont en attente
|
||||
Quand le système organise la file d'attente
|
||||
Alors les signalements sont répartis dans les files suivantes:
|
||||
| file | nombre | priorité |
|
||||
| Immédiate (24/7) | 5 | CRITIQUE |
|
||||
| Prioritaire | 15 | HAUTE |
|
||||
| Normale | 20 | MOYENNE |
|
||||
| Différée | 10 | BASSE |
|
||||
Et les modérateurs traitent en priorité la file Immédiate
|
||||
|
||||
Scénario: Modérateurs assignés selon compétences
|
||||
Étant donné qu'un signalement complexe de harcèlement est reçu
|
||||
Quand le système assigne un modérateur
|
||||
Alors un modérateur senior est prioritairement assigné
|
||||
Et les modérateurs juniors peuvent traiter les cas simples (spam, tags)
|
||||
Et les modérateurs seniors traitent les cas complexes (haine, violence, appels)
|
||||
|
||||
# Technologies opensource
|
||||
|
||||
Scénario: Stack technique 100% opensource
|
||||
Étant donné que le système de modération IA est déployé
|
||||
Quand on analyse les technologies utilisées
|
||||
Alors toutes les technologies sont opensource:
|
||||
| composant | technologie | hébergement |
|
||||
| Transcription | Whisper large-v3 | Self-hosted |
|
||||
| Analyse sentiment | distilbert-base-uncased | Self-hosted |
|
||||
| Détection haine | facebook/roberta-hate-speech | Self-hosted |
|
||||
| Mots-clés interdits | Liste noire FR/EN + regex | PostgreSQL |
|
||||
Et aucune dépendance à Google, AWS, Azure
|
||||
|
||||
# Coût infrastructure
|
||||
|
||||
Plan du Scénario: Coût selon phase du projet
|
||||
Étant donné que RoadWave est en phase "<phase>"
|
||||
Quand on calcule le coût de l'infrastructure IA
|
||||
Alors le coût mensuel est "<cout>"
|
||||
|
||||
Exemples:
|
||||
| phase | cout |
|
||||
| MVP | 0-50€ (CPU) |
|
||||
| Scale | 50-200€ (GPU VPS) |
|
||||
|
||||
Scénario: Processing asynchrone en MVP avec CPU
|
||||
Étant donné que RoadWave est en phase MVP
|
||||
Et que le volume est <1000 signalements/mois
|
||||
Quand le système traite les signalements
|
||||
Alors un serveur CPU standard est suffisant
|
||||
Et le coût est de 0€ (serveur existant)
|
||||
Et le processing asynchrone absorbe les pics de charge
|
||||
Et les délais restent acceptables (1-20 minutes)
|
||||
|
||||
Scénario: Scaling avec GPU pour gros volumes
|
||||
Étant donné que RoadWave reçoit >1000 signalements/jour
|
||||
Quand le système nécessite un scaling
|
||||
Alors un VPS avec GPU est requis
|
||||
Et le coût passe à 50-200€/mois
|
||||
Et les délais de transcription sont divisés par 5-10
|
||||
Et le système peut gérer 10 000+ signalements/mois
|
||||
|
||||
# Logs et audit
|
||||
|
||||
Scénario: Logs d'audit pour chaque traitement
|
||||
Étant donné qu'un signalement est traité
|
||||
Quand une action est prise (rejet, acceptation, sanction)
|
||||
Alors un log d'audit complet est créé:
|
||||
| champ | description |
|
||||
| signalement_id | ID unique du signalement |
|
||||
| content_id | ID du contenu signalé |
|
||||
| ia_score | Score de confiance IA |
|
||||
| ia_category | Catégorie détectée par IA |
|
||||
| priority | CRITIQUE / HAUTE / MOYENNE / BASSE |
|
||||
| moderator_id | ID du modérateur assigné |
|
||||
| action_taken | Retiré / Rejeté / Strike |
|
||||
| processing_time | Durée du traitement |
|
||||
| timestamp | Date et heure de la décision |
|
||||
Et le log est conservé pour conformité DSA
|
||||
Et les logs sont anonymisés après 3 ans (RGPD)
|
||||
|
||||
# Conformité DSA
|
||||
|
||||
Scénario: Traçabilité complète pour conformité DSA
|
||||
Étant donné que le système de modération est actif
|
||||
Quand un audit DSA est effectué
|
||||
Alors toutes les actions de modération sont tracées
|
||||
Et les délais de traitement sont mesurés et respectés
|
||||
Et les décisions sont justifiées et documentées
|
||||
Et la transparence vis-à-vis des utilisateurs est garantie
|
||||
Et le système est conforme au Digital Services Act
|
||||
Reference in New Issue
Block a user