refactor(docs): réorganiser la documentation selon principes DDD
Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @copyright @appeal @mvp
|
||||
Fonctionnalité: Procédure d'appel pour droits d'auteur
|
||||
|
||||
En tant que créateur sanctionné
|
||||
Je veux faire appel d'une décision
|
||||
Afin de contester une sanction injuste
|
||||
|
||||
Scénario: Dépôt d'un appel
|
||||
Étant donné un créateur "alice@roadwave.fr" sanctionné
|
||||
Quand il fait appel dans les 15 jours
|
||||
Alors un dossier d'appel est créé
|
||||
Et il doit fournir des preuves (fair use, licence, etc.)
|
||||
Et un événement "COPYRIGHT_APPEAL_FILED" est enregistré
|
||||
|
||||
Scénario: Examen de l'appel par comité
|
||||
Étant donné un appel déposé
|
||||
Quand le comité l'examine (3 modérateurs)
|
||||
Alors une décision est prise dans les 7 jours
|
||||
Et le créateur est notifié du résultat
|
||||
Et un événement "COPYRIGHT_APPEAL_REVIEWED" est enregistré
|
||||
|
||||
Scénario: Appel accepté - Annulation de la sanction
|
||||
Étant donné un appel validé
|
||||
Alors la sanction est annulée
|
||||
Et le contenu est rétabli
|
||||
Et le compteur d'infractions n'est pas incrémenté
|
||||
Et un événement "COPYRIGHT_APPEAL_ACCEPTED" est enregistré
|
||||
|
||||
Scénario: Appel rejeté - Maintien de la sanction
|
||||
Étant donné un appel rejeté
|
||||
Alors la sanction est maintenue
|
||||
Et le créateur ne peut plus faire appel pour ce cas
|
||||
Et un événement "COPYRIGHT_APPEAL_REJECTED" est enregistré
|
||||
|
||||
Scénario: Délai de prescription des infractions
|
||||
Étant donné une infraction datant de > 2 ans
|
||||
Et aucune nouvelle infraction depuis
|
||||
Alors l'infraction est retirée de l'historique
|
||||
Et ne compte plus dans le système de sanctions progressives
|
||||
Et un événement "COPYRIGHT_INFRACTION_EXPIRED" est enregistré
|
||||
@@ -0,0 +1,76 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @audit @governance @mvp
|
||||
Fonctionnalité: Audit trimestriel du système de modération
|
||||
|
||||
En tant que responsable de la plateforme
|
||||
Je veux un audit trimestriel de la modération
|
||||
Afin d'assurer transparence et amélioration continue
|
||||
|
||||
Scénario: Génération automatique du rapport d'audit
|
||||
Étant donné la fin d'un trimestre (31 mars 2026)
|
||||
Quand le système génère le rapport
|
||||
Alors il contient:
|
||||
| Section | Détails |
|
||||
| Statistiques globales | Signalements, taux de traitement|
|
||||
| Performance modérateurs | Temps moyen, précision |
|
||||
| Contenus bloqués | Par catégorie |
|
||||
| Appels et contestations | Taux d'acceptation |
|
||||
| Améliorations proposées | Recommandations |
|
||||
Et un PDF est généré et archivé
|
||||
Et un événement "QUARTERLY_AUDIT_GENERATED" est enregistré
|
||||
|
||||
Scénario: Publication transparente des métriques
|
||||
Étant donné le rapport d'audit trimestriel
|
||||
Quand il est publié
|
||||
Alors une page publique affiche:
|
||||
| Métrique | Q1 2026 | Q4 2025 |
|
||||
| Signalements traités | 15,234 | 12,876 |
|
||||
| Temps moyen de traitement | 8h | 12h |
|
||||
| Taux de précision automatique | 85% | 82% |
|
||||
| Appels acceptés | 18% | 22% |
|
||||
| Comptes bannis | 234 | 198 |
|
||||
Et un événement "AUDIT_PUBLICLY_PUBLISHED" est enregistré
|
||||
|
||||
Scénario: Analyse des tendances sur 4 trimestres
|
||||
Étant donné 4 rapports trimestriels
|
||||
Alors un graphique d'évolution est affiché:
|
||||
| Métrique | Tendance |
|
||||
| Signalements totaux | +12% par tri |
|
||||
| Temps de traitement | -25% |
|
||||
| Taux de faux positifs | -5% |
|
||||
Et des insights sont générés automatiquement
|
||||
Et un événement "AUDIT_TRENDS_ANALYZED" est enregistré
|
||||
|
||||
Scénario: Recommandations d'amélioration
|
||||
Étant donné le rapport d'audit
|
||||
Quand le système analyse les données
|
||||
Alors des recommandations sont proposées:
|
||||
| Recommandation | Priorité |
|
||||
| Recruter 2 modérateurs supplémentaires| Haute |
|
||||
| Améliorer modèle ML de détection | Moyenne |
|
||||
| Revoir processus d'appel | Basse |
|
||||
Et un plan d'action trimestriel est établi
|
||||
Et un événement "AUDIT_RECOMMENDATIONS_GENERATED" est enregistré
|
||||
|
||||
Scénario: Audit externe annuel
|
||||
Étant donné la fin de l'année (31 décembre)
|
||||
Quand un audit externe est commandé
|
||||
Alors un cabinet indépendant analyse:
|
||||
| Aspect | Conformité |
|
||||
| Respect RGPD | Oui |
|
||||
| Transparence des décisions | Oui |
|
||||
| Impartialité de la modération | Oui |
|
||||
| Temps de réponse | Acceptable |
|
||||
Et un certificat de conformité est délivré
|
||||
Et un événement "EXTERNAL_AUDIT_COMPLETED" est enregistré
|
||||
|
||||
Scénario: Métriques d'impact des audits
|
||||
Étant donné 4 audits trimestriels effectués
|
||||
Alors l'impact est mesuré:
|
||||
| Métrique | Amélioration |
|
||||
| Temps de traitement | -30% |
|
||||
| Satisfaction utilisateurs | +15% |
|
||||
| Taux de faux positifs | -40% |
|
||||
| Coûts de modération | -10% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
76
docs/domains/moderation/features/api/badges-system.feature
Normal file
76
docs/domains/moderation/features/api/badges-system.feature
Normal file
@@ -0,0 +1,76 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @gamification @mvp
|
||||
Fonctionnalité: Système de badges de modération
|
||||
|
||||
En tant qu'utilisateur modérateur
|
||||
Je veux gagner des badges pour ma contribution
|
||||
Afin d'être reconnu et motivé à modérer
|
||||
|
||||
Scénario: Badge Bronze - 10 signalements validés
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui a 10 signalements validés
|
||||
Quand le 10ème signalement est confirmé
|
||||
Alors le badge "Modérateur Bronze" est débloqué
|
||||
Et affiché sur son profil
|
||||
Et +50 points de réputation
|
||||
Et un événement "BADGE_BRONZE_MODERATOR_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Badge Argent - 50 signalements validés
|
||||
Étant donné un utilisateur avec 50 signalements validés
|
||||
Alors le badge "Modérateur Argent" est débloqué
|
||||
Et il obtient des privilèges supplémentaires
|
||||
Et +200 points de réputation
|
||||
Et un événement "BADGE_SILVER_MODERATOR_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Badge Or - 200 signalements validés
|
||||
Étant donné un utilisateur avec 200 signalements validés
|
||||
Alors le badge "Modérateur Or" est débloqué
|
||||
Et il devient "Utilisateur de confiance"
|
||||
Et ses signalements sont traités en priorité
|
||||
Et +500 points de réputation
|
||||
Et un événement "BADGE_GOLD_MODERATOR_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Badge Diamant - 1000 signalements + 95% de précision
|
||||
Étant donné un utilisateur avec 1000 signalements validés
|
||||
Et un taux de précision > 95%
|
||||
Alors le badge "Modérateur Diamant" est débloqué
|
||||
Et il peut devenir modérateur officiel
|
||||
Et +2000 points de réputation
|
||||
Et un événement "BADGE_DIAMOND_MODERATOR_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Perte de badge si précision < 70%
|
||||
Étant donné un utilisateur avec badge Silver
|
||||
Quand son taux de précision tombe < 70%
|
||||
Alors le badge est révoqué temporairement
|
||||
Et il doit retrouver 80% de précision pour le récupérer
|
||||
Et un événement "BADGE_REVOKED_LOW_ACCURACY" est enregistré
|
||||
|
||||
Scénario: Badges spéciaux pour expertise
|
||||
Étant donné un utilisateur spécialisé
|
||||
Alors il peut obtenir des badges thématiques:
|
||||
| Badge | Condition |
|
||||
| Expert droits d'auteur | 100 signalements copyright validés|
|
||||
| Expert contenu offensant | 100 signalements haine validés |
|
||||
| Expert spam | 100 signalements spam validés |
|
||||
Et un événement "EXPERT_BADGE_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Classement des meilleurs modérateurs
|
||||
Étant donné tous les utilisateurs modérateurs
|
||||
Alors un leaderboard est affiché:
|
||||
| Rang | Utilisateur | Signalements | Précision | Badge |
|
||||
| 1 | alice | 1,234 | 98% | Diamant |
|
||||
| 2 | bob | 876 | 96% | Or |
|
||||
| 3 | charlie | 543 | 94% | Or |
|
||||
Et le top 10 reçoit des récompenses mensuelles
|
||||
Et un événement "MODERATOR_LEADERBOARD_VIEWED" est enregistré
|
||||
|
||||
Scénario: Récompenses mensuelles pour top modérateurs
|
||||
Étant donné le top 10 du mois
|
||||
Quand le mois se termine
|
||||
Alors chacun reçoit:
|
||||
| Rang | Récompense |
|
||||
| 1-3 | 6 mois Premium gratuit |
|
||||
| 4-6 | 3 mois Premium gratuit |
|
||||
| 7-10 | 1 mois Premium gratuit |
|
||||
Et un badge "Top modérateur du mois"
|
||||
Et un événement "MONTHLY_MODERATOR_REWARDS_DISTRIBUTED" est enregistré
|
||||
@@ -0,0 +1,84 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @ml @security @mvp
|
||||
Fonctionnalité: Détection de patterns suspects par ML
|
||||
|
||||
En tant que système de sécurité
|
||||
Je veux détecter automatiquement les comportements suspects
|
||||
Afin de prévenir les abus et fraudes
|
||||
|
||||
Scénario: Détection de signalements coordonnés
|
||||
Étant donné 5 utilisateurs qui signalent le même contenu en 10 minutes
|
||||
Et leurs comptes ont été créés la même semaine
|
||||
Quand le système analyse le pattern
|
||||
Alors une alerte "Brigade de signalement" est déclenchée
|
||||
Et les signalements sont mis en quarantaine
|
||||
Et un modérateur vérifie manuellement
|
||||
Et un événement "COORDINATED_REPORTING_DETECTED" est enregistré
|
||||
|
||||
Scénario: Détection de compte bot de signalement
|
||||
Étant donné un compte avec pattern suspect:
|
||||
| Indicateur | Valeur |
|
||||
| Signalements par jour | 50 |
|
||||
| Intervalle régulier | Exactement 120s |
|
||||
| Diversité de contenus | Faible |
|
||||
| Interaction humaine | Aucune |
|
||||
Quand le système ML analyse
|
||||
Alors le compte est identifié comme "Probable bot"
|
||||
Et suspendu automatiquement
|
||||
Et un événement "BOT_ACCOUNT_DETECTED" est enregistré
|
||||
|
||||
Scénario: Détection de vendetta personnelle
|
||||
Étant donné un utilisateur A qui signale systématiquement l'utilisateur B
|
||||
Et 15 signalements en 1 semaine, tous rejetés
|
||||
Quand le système détecte le pattern
|
||||
Alors une alerte "Harcèlement par signalements" est déclenchée
|
||||
Et l'utilisateur A est bloqué de signaler B
|
||||
Et un événement "VENDETTA_PATTERN_DETECTED" est enregistré
|
||||
|
||||
Scénario: Détection d'usage d'IA pour contenu offensant déguisé
|
||||
Étant donné un contenu avec texte subtil généré par IA
|
||||
Quand l'analyse NLP détecte des marqueurs d'IA toxique
|
||||
Alors le contenu est mis en quarantaine
|
||||
Et un modérateur expert vérifie
|
||||
Et un événement "AI_GENERATED_TOXIC_DETECTED" est enregistré
|
||||
|
||||
Scénario: Analyse des métadonnées EXIF suspectes
|
||||
Étant donné une image uploadée avec métadonnées:
|
||||
| Métadonnée | Valeur suspect |
|
||||
| GPS Location | Corée du Nord |
|
||||
| Device Model | Connu pour bots |
|
||||
| Timestamp | Futur (2027) |
|
||||
Quand le système analyse
|
||||
Alors l'image est marquée "Métadonnées suspectes"
|
||||
Et un événement "SUSPICIOUS_METADATA_DETECTED" est enregistré
|
||||
|
||||
Scénario: Score de risque ML combiné
|
||||
Étant donné un contenu analysé par ML
|
||||
Alors un score de risque global est calculé:
|
||||
| Facteur | Poids | Score |
|
||||
| Contenu textuel | 30% | 0.8 |
|
||||
| Métadonnées image | 20% | 0.3 |
|
||||
| Comportement utilisateur | 30% | 0.9 |
|
||||
| Patterns de signalement | 20% | 0.1 |
|
||||
| **Score global** | 100% | **0.65** |
|
||||
Et si score > 0.7, mise en quarantaine automatique
|
||||
Et un événement "ML_RISK_SCORE_CALCULATED" est enregistré
|
||||
|
||||
Scénario: Apprentissage continu du modèle ML
|
||||
Étant donné 10 000 contenus modérés manuellement
|
||||
Quand les décisions humaines sont collectées
|
||||
Alors le modèle ML est réentraîné mensuellement
|
||||
Et la précision s'améliore de 2-3% par itération
|
||||
Et un événement "ML_MODEL_RETRAINED" est enregistré
|
||||
|
||||
Scénario: Métriques de performance de la détection ML
|
||||
Étant donné que 50 000 contenus ont été analysés
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Précision de détection | 87% |
|
||||
| Rappel (contenus détectés) | 82% |
|
||||
| Faux positifs | 8% |
|
||||
| Temps moyen d'analyse | 250ms |
|
||||
| Économie de temps modérateurs | 60% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,51 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @anti-abuse @mvp
|
||||
Fonctionnalité: Limites temporelles anti-abus de modération
|
||||
|
||||
En tant que plateforme
|
||||
Je veux limiter les signalements abusifs
|
||||
Afin de prévenir le spam et les abus du système
|
||||
|
||||
Scénario: Limitation à 20 signalements par jour
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui a fait 20 signalements aujourd'hui
|
||||
Quand il tente un 21ème signalement
|
||||
Alors le signalement est bloqué
|
||||
Et un message s'affiche: "Limite quotidienne atteinte (20 signalements). Réessayez demain."
|
||||
Et un événement "REPORT_DAILY_LIMIT_REACHED" est enregistré
|
||||
|
||||
Scénario: Limite augmentée pour utilisateurs de confiance
|
||||
Étant donné un utilisateur de confiance
|
||||
Alors sa limite quotidienne est de 50 signalements
|
||||
Et un événement "TRUSTED_USER_HIGHER_LIMIT" est enregistré
|
||||
|
||||
Scénario: Cooldown de 5 minutes entre signalements
|
||||
Étant donné un utilisateur qui vient de faire un signalement
|
||||
Quand il tente un nouveau signalement 2 minutes après
|
||||
Alors le signalement est bloqué
|
||||
Et un message affiche: "Attendez 3 minutes avant le prochain signalement"
|
||||
Et un événement "REPORT_COOLDOWN_ACTIVE" est enregistré
|
||||
|
||||
Scénario: Détection de signalements en masse suspects
|
||||
Étant donné un utilisateur qui fait 10 signalements en 10 minutes
|
||||
Quand le système détecte le pattern
|
||||
Alors une alerte modérateur est déclenchée
|
||||
Et l'utilisateur passe en review manuelle
|
||||
Et un événement "MASS_REPORTING_DETECTED" est enregistré
|
||||
|
||||
Scénario: Blocage temporaire pour abus répétés
|
||||
Étant donné un utilisateur avec 10 signalements rejetés en 24h
|
||||
Quand le 10ème est rejeté
|
||||
Alors l'utilisateur est bloqué de la modération pour 7 jours
|
||||
Et un message explique: "Trop de signalements invalides. Blocage temporaire."
|
||||
Et un événement "REPORTING_SUSPENDED_ABUSE" est enregistré
|
||||
|
||||
Scénario: Métriques de détection d'abus
|
||||
Étant donné que 1000 utilisateurs ont tenté d'abuser
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Tentatives de spam détectées | 1,234 |
|
||||
| Utilisateurs bloqués | 156 |
|
||||
| Faux positifs | 2% |
|
||||
| Taux de récidive après blocage | 15% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,397 @@
|
||||
# language: fr
|
||||
|
||||
@moderation @community
|
||||
Fonctionnalité: Modération communautaire - Badges et récompenses
|
||||
En tant que plateforme
|
||||
Je veux gamifier les signalements pertinents
|
||||
Afin d'améliorer la qualité des signalements et réduire la charge modérateurs
|
||||
|
||||
# 19. Modération Communautaire - Badges et Récompenses
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de modération communautaire est actif
|
||||
|
||||
# 19.1 - Système de badges
|
||||
|
||||
Scénario: Trois niveaux de badges disponibles
|
||||
Étant donné que je consulte le système de badges
|
||||
Quand je vois les badges disponibles
|
||||
Alors 3 niveaux de badges existent:
|
||||
| badge | nom | critères | avantages |
|
||||
| 🥉 | Contributeur Bronze | 5 validés + 70% pertinence | Signalements prioritaires (+10 points) |
|
||||
| 🥈 | Contributeur Argent | 20 validés + 80% pertinence | +20 points + Badge visible profil |
|
||||
| 🥇 | Contributeur Or | 50 validés + 90% pertinence | +30 points + Badge + Réduction Premium |
|
||||
Et les badges valorisent la qualité plutôt que la quantité
|
||||
|
||||
Scénario: Règles d'éligibilité aux badges
|
||||
Étant donné que je veux obtenir un badge
|
||||
Quand je consulte les règles d'éligibilité
|
||||
Alors les critères suivants s'appliquent:
|
||||
| règle | valeur |
|
||||
| Minimum signalements envoyés pour éligibilité | 10 |
|
||||
| Signalements "En cours" comptent dans le calcul | non |
|
||||
| Signalements rejetés font baisser le taux | oui |
|
||||
| Période de calcul (glissante) | 6 mois |
|
||||
Et seuls les 6 derniers mois sont pris en compte
|
||||
|
||||
Scénario: Calcul du taux de pertinence
|
||||
Étant donné que j'ai envoyé 20 signalements
|
||||
Et que 16 ont été validés par les modérateurs
|
||||
Et que 4 ont été rejetés
|
||||
Quand le système calcule mon taux de pertinence
|
||||
Alors la formule appliquée est "Signalements validés / Total signalements × 100"
|
||||
Et mon taux est de 80% (16 / 20 × 100)
|
||||
Et ce taux détermine mon éligibilité aux badges
|
||||
|
||||
Scénario: Obtention du badge Bronze
|
||||
Étant donné que j'ai 10 signalements envoyés
|
||||
Et que 7 signalements ont été validés
|
||||
Et que mon taux de pertinence est de 70%
|
||||
Quand le système évalue mon éligibilité
|
||||
Alors j'obtiens le badge 🥉 Contributeur Bronze
|
||||
Et je reçois une notification:
|
||||
"""
|
||||
🎉 Félicitations ! Vous êtes désormais Contributeur Bronze.
|
||||
Merci de rendre RoadWave meilleur !
|
||||
"""
|
||||
Et mes futurs signalements gagnent +10 points de priorité
|
||||
|
||||
Scénario: Obtention du badge Argent
|
||||
Étant donné que j'ai déjà le badge Bronze
|
||||
Et que j'ai 25 signalements envoyés
|
||||
Et que 20 signalements ont été validés
|
||||
Et que mon taux de pertinence est de 80%
|
||||
Et que 30 jours se sont écoulés depuis l'obtention du badge Bronze
|
||||
Quand le système évalue mon éligibilité
|
||||
Alors j'obtiens le badge 🥈 Contributeur Argent
|
||||
Et je reçois une notification:
|
||||
"""
|
||||
🎉 Impressionnant ! Badge Contributeur Argent obtenu.
|
||||
Votre engagement fait la différence !
|
||||
"""
|
||||
Et le badge est visible sur mon profil public
|
||||
Et mes futurs signalements gagnent +20 points de priorité
|
||||
|
||||
Scénario: Obtention du badge Or
|
||||
Étant donné que j'ai déjà le badge Argent
|
||||
Et que j'ai 60 signalements envoyés
|
||||
Et que 54 signalements ont été validés
|
||||
Et que mon taux de pertinence est de 90%
|
||||
Et que 60 jours se sont écoulés depuis l'obtention du badge Argent
|
||||
Quand le système évalue mon éligibilité
|
||||
Alors j'obtiens le badge 🥇 Contributeur Or
|
||||
Et je reçois une notification:
|
||||
"""
|
||||
🎉 Exceptionnel ! Vous êtes Contributeur Or.
|
||||
La communauté vous remercie pour votre aide précieuse !
|
||||
"""
|
||||
Et je bénéficie d'une réduction Premium -50% pendant 3 mois
|
||||
Et mes futurs signalements gagnent +30 points de priorité
|
||||
|
||||
Scénario: Délai minimum entre niveaux de badges
|
||||
Étant donné que j'ai obtenu le badge Bronze il y a 15 jours
|
||||
Et que je remplis les critères pour le badge Argent
|
||||
Quand le système évalue mon éligibilité
|
||||
Alors je ne peux pas encore obtenir le badge Argent
|
||||
Et je dois attendre 15 jours supplémentaires (30 jours minimum)
|
||||
Et cela évite la montée en badge trop rapide (anti-farming)
|
||||
|
||||
# 19.1.3 - Découverte du système
|
||||
|
||||
Scénario: Modal d'information au premier signalement
|
||||
Étant donné que je viens d'envoyer mon tout premier signalement
|
||||
Et que le toast de confirmation standard s'est affiché
|
||||
Quand exactement 2 secondes se sont écoulées
|
||||
Alors une modal d'information s'affiche automatiquement
|
||||
Et la modal explique le système de badges et récompenses
|
||||
Et la modal contient le titre "🎯 Bravo ! Vous contribuez à une communauté plus saine"
|
||||
Et la modal contient le message suivant:
|
||||
"""
|
||||
En signalant ce contenu, vous participez activement à améliorer
|
||||
l'expérience de tous les utilisateurs RoadWave.
|
||||
|
||||
Vos contributions de qualité sont valorisées et récompensées :
|
||||
|
||||
🥉 Bronze : 5 signalements validés
|
||||
→ Signalements prioritaires (+10 points)
|
||||
|
||||
🥈 Argent : 20 signalements validés
|
||||
→ Badge visible + priorité accrue (+20 points)
|
||||
|
||||
🥇 Or : 50 signalements validés
|
||||
→ Réduction Premium -50% pendant 3 mois
|
||||
|
||||
💡 Votre taux de pertinence compte !
|
||||
Formule : Signalements validés ÷ Total × 100
|
||||
|
||||
Continuez à nous aider, chaque signalement pertinent compte ! 🙏
|
||||
"""
|
||||
Et la modal contient un bouton "En savoir plus" qui redirige vers la page dédiée badges
|
||||
Et la modal contient un bouton "J'ai compris" qui ferme la modal
|
||||
Et la modal ne se réaffiche jamais (flag "badge_modal_seen" en base de données)
|
||||
Et le délai de 2 secondes permet de laisser l'utilisateur lire le toast de confirmation d'abord
|
||||
|
||||
# 19.1.4 - Affichage badges et statistiques
|
||||
|
||||
Scénario: Statistiques personnelles visibles
|
||||
Étant donné que j'ai un badge Bronze
|
||||
Quand je consulte "Profil > Mes signalements"
|
||||
Alors je vois mes statistiques de modération:
|
||||
"""
|
||||
📊 Vos statistiques de modération
|
||||
Signalements envoyés : 27
|
||||
Validés : 23 ✅
|
||||
Rejetés : 4 ❌
|
||||
Taux de pertinence : 85%
|
||||
|
||||
Badge actuel : 🥉 Contributeur Bronze
|
||||
Prochain palier : 🥈 Contributeur Argent (17 signalements validés restants)
|
||||
"""
|
||||
Et je vois ma progression vers le prochain badge
|
||||
|
||||
Scénario: Toast après validation de signalement
|
||||
Étant donné que j'ai un badge Bronze (3/5 signalements validés)
|
||||
Et que j'envoie un nouveau signalement
|
||||
Quand le modérateur valide mon signalement
|
||||
Alors je reçois un toast:
|
||||
"""
|
||||
✅ Bravo ! Votre signalement a aidé la communauté.
|
||||
Progression : 4/5 pour badge Bronze 🥉
|
||||
"""
|
||||
Et je vois ma progression vers le badge suivant
|
||||
|
||||
Scénario: Toast après rejet de signalement
|
||||
Étant donné que j'ai un taux de pertinence de 65%
|
||||
Et que j'envoie un nouveau signalement
|
||||
Quand le modérateur rejette mon signalement
|
||||
Alors je reçois un toast:
|
||||
"""
|
||||
❌ Signalement non retenu.
|
||||
Taux de pertinence : 60%.
|
||||
Continuez vos efforts !
|
||||
"""
|
||||
Et je vois l'impact sur mon taux de pertinence
|
||||
|
||||
# 19.2 - Score de fiabilité
|
||||
|
||||
Scénario: Calcul du score de fiabilité
|
||||
Étant donné que j'ai 15 signalements validés
|
||||
Et que j'ai 3 signalements rejetés
|
||||
Et que j'ai le badge Or actif
|
||||
Quand le système calcule mon score de fiabilité
|
||||
Alors la formule appliquée est:
|
||||
"""
|
||||
Score fiabilité = min(100, (Validés × 10 - Rejetés × 5 + Bonus_Or × 20))
|
||||
"""
|
||||
Et mon score est: min(100, (15 × 10 - 3 × 5 + 1 × 20)) = 100 (plafonné)
|
||||
Et ce score est utilisé dans l'algorithme de priorisation
|
||||
|
||||
Scénario: Utilisation du score dans la priorisation
|
||||
Étant donné que j'ai un score de fiabilité de 85/100
|
||||
Et qu'un autre utilisateur a un score de 30/100
|
||||
Quand nous signalons des contenus similaires
|
||||
Alors mon signalement a un meilleur score de priorité
|
||||
Et mon signalement est traité en premier
|
||||
Et la formule de priorité inclut:
|
||||
"""
|
||||
Priorité = (Score_IA × 0.7) + (Signalements_cumulés × 0.2) + (Fiabilité_signaleur × 0.1)
|
||||
"""
|
||||
Et la fiabilité est normalisée : 85/100 = 0.85
|
||||
|
||||
# 19.3 - Statut "Utilisateur de confiance"
|
||||
|
||||
Scénario: Obtention automatique du statut de confiance
|
||||
Étant donné que j'obtiens le badge Argent
|
||||
Quand mon statut est mis à jour
|
||||
Alors je deviens automatiquement "Utilisateur de confiance"
|
||||
Et mes signalements sont traités en priorité (même score IA)
|
||||
Et je reçois des notifications sous 12h (au lieu de 24-48h)
|
||||
Et le badge "Utilisateur de confiance" s'affiche sur mon profil
|
||||
|
||||
Scénario: Révocation du statut de confiance
|
||||
Étant donné que je suis "Utilisateur de confiance"
|
||||
Et que je perds mon badge Argent après audit trimestriel
|
||||
Quand mon statut est réévalué
|
||||
Alors le statut "Utilisateur de confiance" est révoqué
|
||||
Et je reviens au statut normal
|
||||
Et aucune sanction supplémentaire n'est appliquée
|
||||
|
||||
# 19.4 - Réduction Premium pour badge Or
|
||||
|
||||
Scénario: Notification de réduction Premium au badge Or
|
||||
Étant donné que j'obtiens le badge Contributeur Or
|
||||
Quand la notification est envoyée
|
||||
Alors je reçois un email + push + in-app:
|
||||
"""
|
||||
🎉 Exceptionnel ! Vous avez obtenu le badge Contributeur Or
|
||||
|
||||
Vous faites partie des meilleurs contributeurs de RoadWave.
|
||||
Grâce à votre engagement et votre vigilance, vous aidez
|
||||
des milliers d'utilisateurs à profiter d'une expérience audio de qualité.
|
||||
|
||||
La communauté vous remercie ! 🙏
|
||||
|
||||
En reconnaissance de votre aide précieuse, vous bénéficiez de :
|
||||
|
||||
✨ 3 mois d'abonnement Premium à -50%
|
||||
→ 2.49€/mois au lieu de 4.99€
|
||||
|
||||
[Profiter de l'offre]
|
||||
|
||||
Cette offre est valable pendant 30 jours.
|
||||
"""
|
||||
Et l'offre est valable pendant 30 jours
|
||||
|
||||
Scénario: Activation de la réduction Premium Or
|
||||
Étant donné que j'ai obtenu le badge Or
|
||||
Et que j'ai reçu l'offre Premium -50%
|
||||
Quand je clique sur "Profiter de l'offre" dans les 30 jours
|
||||
Alors je souscris à Premium à 2.49€/mois
|
||||
Et la réduction est valable pour 3 mois
|
||||
Et après 3 mois, le renouvellement passe à 4.99€/mois
|
||||
Et l'offre n'est pas cumulable avec l'offre annuelle
|
||||
|
||||
Scénario: Expiration de l'offre Premium après 30 jours
|
||||
Étant donné que j'ai obtenu le badge Or il y a 31 jours
|
||||
Et que je n'ai pas activé l'offre Premium -50%
|
||||
Quand j'essaie d'activer l'offre
|
||||
Alors l'offre a expiré
|
||||
Et je vois le message "Votre offre Premium -50% a expiré"
|
||||
Et mon badge Or est conservé (seule l'offre expire)
|
||||
Et je ne peux plus bénéficier de la réduction
|
||||
|
||||
Scénario: Rappels avant expiration de l'offre
|
||||
Étant donné que j'ai obtenu le badge Or
|
||||
Et que je n'ai pas encore activé l'offre Premium
|
||||
Quand il reste 7 jours avant l'expiration
|
||||
Alors je reçois un email + push:
|
||||
"""
|
||||
Il vous reste 7 jours pour profiter de votre réduction Premium -50%
|
||||
"""
|
||||
Et quand il reste 1 jour, je reçois un dernier rappel:
|
||||
"""
|
||||
Dernière chance ! Votre réduction Premium -50% expire demain
|
||||
"""
|
||||
|
||||
Scénario: Perte du badge Or pendant l'abonnement Premium
|
||||
Étant donné que j'ai le badge Or et l'abonnement Premium -50% actif
|
||||
Et que je perds le badge Or après un audit trimestriel
|
||||
Quand mon abonnement arrive à échéance
|
||||
Alors l'abonnement en cours reste actif jusqu'à sa fin normale
|
||||
Mais le renouvellement se fait à prix normal 4.99€/mois
|
||||
Et je ne peux pas réobtenir l'offre -50% même si je récupère le badge Or
|
||||
|
||||
# 19.5 - Anti-abus
|
||||
|
||||
Scénario: Limite de 10 signalements par 24h
|
||||
Étant donné que j'ai déjà envoyé 10 signalements aujourd'hui
|
||||
Quand j'essaie d'envoyer un 11ème signalement
|
||||
Alors le signalement est automatiquement rejeté
|
||||
Et je vois le message:
|
||||
"""
|
||||
Limite quotidienne atteinte (10 signalements/24h).
|
||||
Réessayez demain.
|
||||
"""
|
||||
Et une alerte modérateur automatique est déclenchée
|
||||
|
||||
Scénario: Détection de signalement massif suspect
|
||||
Étant donné que j'ai envoyé 35 signalements cette semaine
|
||||
Quand l'audit automatique hebdomadaire s'exécute
|
||||
Alors mon compte est détecté comme suspect (>30/semaine)
|
||||
Et une enquête manuelle modérateur est déclenchée
|
||||
Et le modérateur peut révoquer mon badge si abus confirmé
|
||||
|
||||
Scénario: Patterns suspects détectés
|
||||
Étant donné que le système analyse mes patterns de signalement
|
||||
Quand des comportements suspects sont identifiés:
|
||||
| pattern | seuil |
|
||||
| Signalement massif | >30/semaine |
|
||||
| Taux de pertinence très faible | <50% |
|
||||
| Tous signalements rejetés sur 7 jours | 100% rejet |
|
||||
| Signalements ciblant toujours même créateur | Harcèlement |
|
||||
Alors une enquête manuelle est déclenchée
|
||||
Et le modérateur examine les signalements en détail
|
||||
|
||||
Scénario: Audit trimestriel automatique des badges
|
||||
Étant donné que le système effectue l'audit trimestriel
|
||||
Quand mon badge est audité
|
||||
Alors le système recalcule mon taux de pertinence sur 6 mois glissants
|
||||
Et vérifie les critères:
|
||||
| badge | taux minimum |
|
||||
| Bronze | 70% |
|
||||
| Argent | 80% |
|
||||
| Or | 90% |
|
||||
Et si mon taux est insuffisant, mon badge est révoqué
|
||||
|
||||
Scénario: Email de prévention 7 jours avant audit
|
||||
Étant donné que l'audit trimestriel arrive dans 7 jours
|
||||
Et que mon taux de pertinence est de 78%
|
||||
Et que j'ai un badge Argent (minimum 80% requis)
|
||||
Quand le système envoie les notifications préventives
|
||||
Alors je reçois un email:
|
||||
"""
|
||||
Votre badge Contributeur Argent sera audité dans 7 jours.
|
||||
Taux de pertinence actuel : 78%
|
||||
Minimum requis : 80%
|
||||
|
||||
Continuez à signaler du contenu pertinent pour conserver votre badge !
|
||||
"""
|
||||
Et je suis informé à l'avance pour améliorer mes signalements
|
||||
|
||||
Scénario: Résultat d'audit - Badge conservé
|
||||
Étant donné que l'audit trimestriel vient d'être effectué
|
||||
Et que mon taux de pertinence est de 85%
|
||||
Et que j'ai un badge Argent (minimum 80% requis)
|
||||
Quand je reçois le résultat
|
||||
Alors je reçois un email: "Badge conservé ✓"
|
||||
Et mon badge reste actif pour 3 mois supplémentaires
|
||||
|
||||
Scénario: Résultat d'audit - Badge révoqué
|
||||
Étant donné que l'audit trimestriel vient d'être effectué
|
||||
Et que mon taux de pertinence est de 75%
|
||||
Et que j'ai un badge Argent (minimum 80% requis)
|
||||
Quand je reçois le résultat
|
||||
Alors je reçois un email: "Badge révoqué ✗"
|
||||
Et mon badge Argent est révoqué immédiatement
|
||||
Mais je peux réobtenir un badge ultérieurement (pas de ban)
|
||||
|
||||
Scénario: Sanctions pour abus détecté - Mineur
|
||||
Étant donné que j'ai envoyé >10 signalements/jour pendant 1 jour
|
||||
Quand l'abus mineur est détecté
|
||||
Alors je reçois un avertissement
|
||||
Et ma limite est réduite à 5 signalements/jour pendant 7 jours
|
||||
Et je reçois une notification explicative
|
||||
|
||||
Scénario: Sanctions pour abus détecté - Modéré
|
||||
Étant donné que j'ai envoyé >30 signalements/semaine
|
||||
Et que mon taux de pertinence est <50%
|
||||
Quand l'abus modéré est confirmé
|
||||
Alors tous mes badges sont révoqués
|
||||
Et je suis interdit de signalement pendant 30 jours
|
||||
Et je reçois une notification de sanction
|
||||
|
||||
Scénario: Sanctions pour abus détecté - Grave
|
||||
Étant donné que j'ai participé à un farming coordonné de signalements
|
||||
Quand l'abus grave est confirmé par modérateur
|
||||
Alors je reçois un ban permanent de la fonctionnalité signalement
|
||||
Et tous mes badges sont révoqués définitivement
|
||||
Et il n'y a pas de recours possible pour farming confirmé
|
||||
|
||||
# ROI et justification
|
||||
|
||||
Scénario: ROI positif de la modération communautaire
|
||||
Étant donné que 10 utilisateurs Or sont actifs
|
||||
Quand on calcule le ROI
|
||||
Alors chaque utilisateur Or économise 5-10h de modération/mois
|
||||
Et cela représente 75-150€ économisés par utilisateur (taux 15€/h)
|
||||
Et le total est de 750-1500€ économisés/mois
|
||||
Et le coût des réductions Premium est maximum 200€/mois (50 utilisateurs Or)
|
||||
Et le ROI est positif dès 2-3 utilisateurs Or actifs
|
||||
|
||||
Scénario: Coût total du système
|
||||
Étant donné que le système de modération communautaire est en place
|
||||
Quand on calcule le coût total
|
||||
Alors en phase MVP, le coût est de 0€
|
||||
Et en phase Post-MVP avec réductions Premium, le coût est de 0-200€/mois
|
||||
Et le système est entièrement automatique (0€ développement continu)
|
||||
Et le ROI est largement positif
|
||||
@@ -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
|
||||
@@ -0,0 +1,56 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @premium @rewards @mvp
|
||||
Fonctionnalité: Réduction Premium pour badge Or
|
||||
|
||||
En tant qu'utilisateur avec badge Or
|
||||
Je veux obtenir une réduction sur l'abonnement Premium
|
||||
Afin d'être récompensé de ma contribution
|
||||
|
||||
Scénario: Réduction automatique à l'obtention du badge Or
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui débloque le badge Or
|
||||
Quand il consulte la page Premium
|
||||
Alors une réduction de 20% est automatiquement appliquée
|
||||
Et le prix passe de 4.99€/mois à 3.99€/mois
|
||||
Et un événement "PREMIUM_DISCOUNT_GOLD_APPLIED" est enregistré
|
||||
|
||||
Scénario: Cumul avec autres réductions
|
||||
Étant donné un utilisateur avec badge Or ET statut Trusted
|
||||
Alors les réductions se cumulent:
|
||||
| Réduction | Montant |
|
||||
| Badge Or | -20% |
|
||||
| Utilisateur confiance| -10% |
|
||||
| Total | -30% |
|
||||
Et le prix final: 4.99€ - 30% = 3.49€/mois
|
||||
Et un événement "PREMIUM_DISCOUNTS_STACKED" est enregistré
|
||||
|
||||
Scénario: Badge Diamant - Premium gratuit à vie
|
||||
Étant donné un utilisateur avec badge Diamant
|
||||
Alors l'abonnement Premium est gratuit à vie
|
||||
Et aucun paiement n'est requis
|
||||
Et un badge spécial "Premium Lifetime" s'affiche
|
||||
Et un événement "PREMIUM_LIFETIME_GRANTED" est enregistré
|
||||
|
||||
Scénario: Perte de la réduction si perte du badge
|
||||
Étant donné un utilisateur avec badge Or et réduction active
|
||||
Quand le badge Or est révoqué (précision < 70%)
|
||||
Alors la réduction est supprimée au prochain renouvellement
|
||||
Et l'utilisateur est notifié 7 jours à l'avance
|
||||
Et un événement "PREMIUM_DISCOUNT_REVOKED" est enregistré
|
||||
|
||||
Scénario: Code promo automatique pour badge Or
|
||||
Étant donné un utilisateur "bob@roadwave.fr" avec badge Or
|
||||
Quand il s'abonne à Premium
|
||||
Alors un code promo "GOLD20" est automatiquement appliqué
|
||||
Et visible dans la facture
|
||||
Et un événement "PREMIUM_PROMO_CODE_APPLIED" est enregistré
|
||||
|
||||
Scénario: Statistiques d'impact des réductions
|
||||
Étant donné que 200 utilisateurs ont badge Or
|
||||
Alors les métriques montrent:
|
||||
| Métrique | Valeur |
|
||||
| Utilisateurs avec réduction | 200 |
|
||||
| Taux de conversion Premium (Or) | 45% |
|
||||
| Taux de conversion Premium (standard)| 12% |
|
||||
| Revenus générés malgré réduction | +35% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,42 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @sanctions @mvp
|
||||
Fonctionnalité: Sanctions progressives pour abus de signalement
|
||||
|
||||
En tant que plateforme
|
||||
Je veux sanctionner les abus de signalement progressivement
|
||||
Afin de dissuader le spam et les faux signalements
|
||||
|
||||
Scénario: Premier abus - Avertissement
|
||||
Étant donné un utilisateur avec 3 faux signalements en 24h
|
||||
Quand le 3ème est confirmé comme faux
|
||||
Alors un avertissement est envoyé
|
||||
Et un message explique les règles
|
||||
Et un événement "ABUSE_WARNING_ISSUED" est enregistré
|
||||
|
||||
Scénario: Deuxième abus - Limitation temporaire
|
||||
Étant donné un utilisateur avec 2ème série de faux signalements
|
||||
Alors il est limité à 5 signalements par jour pendant 7 jours
|
||||
Et un événement "ABUSE_LIMITED_REPORTING" est enregistré
|
||||
|
||||
Scénario: Troisième abus - Suspension 30 jours
|
||||
Étant donné un utilisateur avec 3ème série d'abus
|
||||
Alors il perd le droit de signaler pendant 30 jours
|
||||
Et tous ses badges modération sont révoqués
|
||||
Et un événement "ABUSE_SUSPENDED_30D" est enregistré
|
||||
|
||||
Scénario: Quatrième abus - Bannissement définitif
|
||||
Étant donné un utilisateur avec 4ème série d'abus
|
||||
Alors il est définitivement banni de la modération
|
||||
Et ne peut jamais récupérer ce droit
|
||||
Et un événement "ABUSE_PERMANENT_BAN" est enregistré
|
||||
|
||||
Scénario: Métriques de sanctions
|
||||
Étant donné que 500 sanctions ont été appliquées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Sanction | Nombre | % |
|
||||
| Avertissements | 320 | 64% |
|
||||
| Limitations | 120 | 24% |
|
||||
| Suspensions 30j | 50 | 10% |
|
||||
| Bannissements | 10 | 2% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,43 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @copyright @sanctions @mvp
|
||||
Fonctionnalité: Sanctions progressives pour violations droits d'auteur
|
||||
|
||||
En tant que plateforme
|
||||
Je veux appliquer des sanctions progressives
|
||||
Afin de dissuader les violations répétées
|
||||
|
||||
Scénario: Première infraction - Avertissement
|
||||
Étant donné un créateur "alice@roadwave.fr" première infraction
|
||||
Quand la violation est confirmée
|
||||
Alors un avertissement formel est envoyé
|
||||
Et le contenu est retiré
|
||||
Et aucune sanction sur le compte
|
||||
Et un événement "COPYRIGHT_WARNING_ISSUED" est enregistré
|
||||
|
||||
Scénario: Deuxième infraction - Suspension 7 jours
|
||||
Étant donné un créateur avec 2ème infraction
|
||||
Alors le compte est suspendu 7 jours
|
||||
Et tous les contenus sont masqués temporairement
|
||||
Et un événement "COPYRIGHT_SUSPENSION_7D" est enregistré
|
||||
|
||||
Scénario: Troisième infraction - Suspension 30 jours
|
||||
Étant donné un créateur avec 3ème infraction
|
||||
Alors le compte est suspendu 30 jours
|
||||
Et perte de tous les badges
|
||||
Et un événement "COPYRIGHT_SUSPENSION_30D" est enregistré
|
||||
|
||||
Scénario: Quatrième infraction - Bannissement définitif
|
||||
Étant donné un créateur avec 4ème infraction
|
||||
Alors le compte est définitivement banni
|
||||
Et tous les contenus sont supprimés
|
||||
Et l'email/IP sont blacklistés
|
||||
Et un événement "COPYRIGHT_PERMANENT_BAN" est enregistré
|
||||
|
||||
Scénario: Réhabilitation après bonne conduite
|
||||
Étant donné un créateur suspendu depuis 6 mois
|
||||
Et aucune nouvelle infraction
|
||||
Quand il demande une réhabilitation
|
||||
Alors son historique peut être effacé
|
||||
Et il repart avec un compteur à zéro
|
||||
Et un événement "COPYRIGHT_REHABILITATION_GRANTED" est enregistré
|
||||
@@ -0,0 +1,352 @@
|
||||
# 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 dans l'heure suivant la sanction
|
||||
Alors l'email contient la structure exacte 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é.
|
||||
|
||||
─────────────────────────────────────
|
||||
📋 DÉTAILS DE LA SANCTION
|
||||
─────────────────────────────────────
|
||||
|
||||
Catégorie violée : 🚫 Haine & violence (Article 3.2 CGU)
|
||||
Raison détaillée : Propos discriminatoires envers un groupe de personnes
|
||||
|
||||
─────────────────────────────────────
|
||||
🔊 PASSAGE PROBLÉMATIQUE
|
||||
─────────────────────────────────────
|
||||
|
||||
Timestamp : 3:42-4:15 (33 secondes)
|
||||
Transcription : "[passage problématique surligné en rouge]"
|
||||
|
||||
─────────────────────────────────────
|
||||
⚠️ SANCTION APPLIQUÉE
|
||||
─────────────────────────────────────
|
||||
|
||||
Strike actuel : 2/4
|
||||
Conséquence : Suspension de votre compte pendant 7 jours
|
||||
Date de fin : 22/01/2026
|
||||
|
||||
Que se passe-t-il ensuite ?
|
||||
• Strike 3 : Suspension 30 jours
|
||||
• Strike 4 : Ban définitif
|
||||
|
||||
─────────────────────────────────────
|
||||
📝 RECOURS
|
||||
─────────────────────────────────────
|
||||
|
||||
Vous pouvez contester cette décision sous 7 jours :
|
||||
[Lien formulaire d'appel]
|
||||
|
||||
Cordialement,
|
||||
L'équipe RoadWave
|
||||
"""
|
||||
Et l'email est envoyé via le service Brevo ou Resend
|
||||
Et le coût d'envoi est d'environ 0.001€ par email
|
||||
Et l'email contient un lien direct vers le formulaire d'appel pré-rempli
|
||||
|
||||
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
|
||||
@@ -0,0 +1,82 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @scoring @mvp
|
||||
Fonctionnalité: Score de fiabilité et priorisation des signalements
|
||||
|
||||
En tant que système de modération
|
||||
Je veux prioriser les signalements selon la fiabilité du rapporteur
|
||||
Afin d'optimiser le traitement par les modérateurs
|
||||
|
||||
Scénario: Calcul du score de fiabilité
|
||||
Étant donné un utilisateur "alice@roadwave.fr" avec historique:
|
||||
| Signalements totaux | Validés | Rejetés | Taux de précision |
|
||||
| 50 | 48 | 2 | 96% |
|
||||
Alors son score de fiabilité est: 96/100
|
||||
Et un événement "RELIABILITY_SCORE_CALCULATED" est enregistré
|
||||
|
||||
Scénario: Priorisation haute pour utilisateurs fiables
|
||||
Étant donné un utilisateur avec score 95+
|
||||
Quand il fait un signalement
|
||||
Alors le signalement est marqué "Priorité haute"
|
||||
Et traité en < 2 heures
|
||||
Et un événement "HIGH_PRIORITY_REPORT_QUEUED" est enregistré
|
||||
|
||||
Scénario: Priorisation normale pour nouveaux utilisateurs
|
||||
Étant donné un nouvel utilisateur sans historique
|
||||
Quand il fait un signalement
|
||||
Alors le signalement est marqué "Priorité normale"
|
||||
Et traité en < 24 heures
|
||||
Et un événement "NORMAL_PRIORITY_REPORT_QUEUED" est enregistré
|
||||
|
||||
Scénario: Priorisation basse pour utilisateurs peu fiables
|
||||
Étant donné un utilisateur avec score < 60
|
||||
Quand il fait un signalement
|
||||
Alors le signalement est marqué "Priorité basse"
|
||||
Et traité en < 72 heures
|
||||
Et nécessite une vérification renforcée
|
||||
Et un événement "LOW_PRIORITY_REPORT_QUEUED" est enregistré
|
||||
|
||||
Scénario: Augmentation du score après signalements validés
|
||||
Étant donné un utilisateur avec score 70
|
||||
Quand 10 signalements consécutifs sont validés
|
||||
Alors le score passe à 85
|
||||
Et il monte de catégorie (basse → normale)
|
||||
Et un événement "RELIABILITY_SCORE_INCREASED" est enregistré
|
||||
|
||||
Scénario: Diminution du score après faux signalements
|
||||
Étant donné un utilisateur avec score 90
|
||||
Quand 5 signalements consécutifs sont rejetés
|
||||
Alors le score passe à 75
|
||||
Et il redescend de catégorie (haute → normale)
|
||||
Et un avertissement est envoyé
|
||||
Et un événement "RELIABILITY_SCORE_DECREASED" est enregistré
|
||||
|
||||
Scénario: Réinitialisation du score après inactivité
|
||||
Étant donné un utilisateur inactif pendant 6 mois
|
||||
Quand il refait un signalement
|
||||
Alors son score est réinitialisé à 50 (neutre)
|
||||
Et il doit reconstruire sa réputation
|
||||
Et un événement "RELIABILITY_SCORE_RESET" est enregistré
|
||||
|
||||
Scénario: Affichage du score dans le profil
|
||||
Étant donné un utilisateur "bob@roadwave.fr"
|
||||
Quand il consulte son profil
|
||||
Alors il voit:
|
||||
| Métrique | Valeur |
|
||||
| Score de fiabilité | 87/100 |
|
||||
| Signalements validés | 145 |
|
||||
| Taux de précision | 87% |
|
||||
| Catégorie | Haute |
|
||||
Et un graphique d'évolution du score
|
||||
Et un événement "RELIABILITY_SCORE_VIEWED" est enregistré
|
||||
|
||||
Scénario: Métriques de performance de la priorisation
|
||||
Étant donné que 10 000 signalements ont été traités
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Temps moyen de traitement (haute) | 1.5h |
|
||||
| Temps moyen de traitement (normale) | 18h |
|
||||
| Temps moyen de traitement (basse) | 48h |
|
||||
| Taux de validation (haute) | 92% |
|
||||
| Taux de validation (basse) | 65% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,53 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @copyright @mvp
|
||||
Fonctionnalité: Signalement musique a posteriori
|
||||
|
||||
En tant qu'ayant-droit ou utilisateur
|
||||
Je veux signaler une utilisation musicale non conforme
|
||||
Afin de faire respecter les droits d'auteur
|
||||
|
||||
Scénario: Signalement par un ayant-droit
|
||||
Étant donné un ayant-droit "Universal Music"
|
||||
Quand il signale un contenu avec sa musique
|
||||
Alors un formulaire DMCA est pré-rempli
|
||||
Et le contenu est immédiatement suspendu (safe harbor)
|
||||
Et le créateur est notifié
|
||||
Et un événement "COPYRIGHT_CLAIM_FILED" est enregistré
|
||||
|
||||
Scénario: Vérification du signalement par modérateur
|
||||
Étant donné un signalement reçu
|
||||
Quand un modérateur l'examine
|
||||
Alors il écoute le contenu
|
||||
Et vérifie si fair use (< 30s)
|
||||
Et prend une décision dans les 48h
|
||||
Et un événement "COPYRIGHT_CLAIM_REVIEWED" est enregistré
|
||||
|
||||
Scénario: Contre-signalement du créateur
|
||||
Étant donné un créateur "alice@roadwave.fr" dont le contenu est suspendu
|
||||
Quand il fait un counter-claim avec preuve
|
||||
Alors le dossier est transmis à l'ayant-droit
|
||||
Et celui-ci a 14 jours pour répondre
|
||||
Et un événement "COPYRIGHT_COUNTER_CLAIM_FILED" est enregistré
|
||||
|
||||
Scénario: Rétablissement du contenu si fair use validé
|
||||
Étant donné un contenu suspendu
|
||||
Quand le modérateur confirme le fair use
|
||||
Alors le contenu est rétabli
|
||||
Et le signalement est rejeté
|
||||
Et le créateur est notifié
|
||||
Et un événement "COPYRIGHT_CLAIM_REJECTED" est enregistré
|
||||
|
||||
Scénario: Sanctions pour abus de signalement
|
||||
Étant donné un ayant-droit qui abuse des signalements
|
||||
Quand 3 signalements consécutifs sont rejetés
|
||||
Alors son compte est suspendu temporairement
|
||||
Et un événement "COPYRIGHT_CLAIMANT_SUSPENDED" est enregistré
|
||||
|
||||
Scénario: Historique des signalements pour un créateur
|
||||
Étant donné un créateur "bob@roadwave.fr"
|
||||
Alors il voit ses signalements:
|
||||
| Date | Ayant-droit | Statut | Issue |
|
||||
| 2026-02-01 | Sony Music | Résolu | Fair use OK|
|
||||
| 2026-01-10 | Warner | Confirmé | Contenu retiré|
|
||||
Et un événement "COPYRIGHT_HISTORY_VIEWED" est enregistré
|
||||
225
docs/domains/moderation/features/api/signalement.feature
Normal file
225
docs/domains/moderation/features/api/signalement.feature
Normal file
@@ -0,0 +1,225 @@
|
||||
# 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é (voir Section 18) |
|
||||
| 📧 | 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
|
||||
Et la catégorie "Droits d'auteur" renvoie vers les règles détaillées de détection automatique
|
||||
|
||||
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
|
||||
@@ -0,0 +1,270 @@
|
||||
# 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 précis:
|
||||
| timestamp | durée | texte problématique | score confiance |
|
||||
| 02:15 | 12s | [insulte discriminatoire] | 97% |
|
||||
| 03:42 | 18s | [propos haineux] | 95% |
|
||||
Et chaque passage problématique a un timestamp de début et de fin
|
||||
Et le signalement est classé en priorité CRITIQUE
|
||||
Et les timestamps sont utilisés pour générer les marqueurs audio dans le dashboard modérateur
|
||||
|
||||
# 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
|
||||
@@ -0,0 +1,63 @@
|
||||
# language: fr
|
||||
|
||||
@api @moderation @trust @mvp
|
||||
Fonctionnalité: Statut utilisateur de confiance
|
||||
|
||||
En tant qu'utilisateur méritant
|
||||
Je veux obtenir le statut "Utilisateur de confiance"
|
||||
Afin de bénéficier de privilèges et reconnaissance
|
||||
|
||||
Scénario: Critères d'obtention du statut
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui remplit:
|
||||
| Critère | Requis | Actuel |
|
||||
| Compte actif depuis | 6 mois | 8 mois |
|
||||
| Signalements validés | 100 | 150 |
|
||||
| Taux de précision | 90% | 94% |
|
||||
| Badge modération | Or | Or |
|
||||
| Aucune sanction | Oui | Oui |
|
||||
Quand les critères sont remplis
|
||||
Alors le statut "Utilisateur de confiance" est accordé
|
||||
Et un événement "TRUSTED_USER_STATUS_GRANTED" est enregistré
|
||||
|
||||
Scénario: Privilèges de l'utilisateur de confiance
|
||||
Étant donné un utilisateur de confiance
|
||||
Alors il bénéficie de:
|
||||
| Privilège | Détail |
|
||||
| Signalements traités en priorité | < 1h au lieu de 24h |
|
||||
| Modération de commentaires | Peut masquer spam/haine |
|
||||
| Badge profil "Trusted" | Visible publiquement |
|
||||
| Réduction Premium -20% | Sur abonnement annuel |
|
||||
| Accès beta features | Nouvelles fonctionnalités |
|
||||
Et un événement "TRUSTED_USER_PRIVILEGES_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Badge "Trusted" visible sur le profil
|
||||
Étant donné un utilisateur de confiance
|
||||
Quand son profil est consulté
|
||||
Alors un badge bleu "✓ Utilisateur de confiance" s'affiche
|
||||
Et une tooltip explique le statut
|
||||
Et un événement "TRUSTED_BADGE_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Révocation du statut pour inactivité
|
||||
Étant donné un utilisateur de confiance inactif 6 mois
|
||||
Quand le système vérifie les statuts
|
||||
Alors le statut est révoqué automatiquement
|
||||
Et l'utilisateur est notifié
|
||||
Et peut le retrouver en redevenant actif
|
||||
Et un événement "TRUSTED_STATUS_REVOKED_INACTIVITY" est enregistré
|
||||
|
||||
Scénario: Révocation du statut pour baisse de précision
|
||||
Étant donné un utilisateur de confiance
|
||||
Quand son taux de précision passe < 85%
|
||||
Alors le statut est révoqué temporairement
|
||||
Et il doit retrouver 90% pour le récupérer
|
||||
Et un événement "TRUSTED_STATUS_REVOKED_LOW_ACCURACY" est enregistré
|
||||
|
||||
Scénario: Statistiques des utilisateurs de confiance
|
||||
Étant donné que 500 utilisateurs ont le statut
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Nombre d'utilisateurs de confiance| 500 |
|
||||
| % de la base utilisateurs | 0.5% |
|
||||
| Temps moyen pour obtenir statut | 8 mois |
|
||||
| Taux de rétention du statut | 92% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
Reference in New Issue
Block a user