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,349 @@
|
||||
# language: fr
|
||||
|
||||
@admin @moderation @dashboard
|
||||
Fonctionnalité: Dashboard modération pour modérateurs
|
||||
En tant que modérateur
|
||||
Je veux accéder à un dashboard centralisé de modération
|
||||
Afin de traiter efficacement les signalements et gérer les sanctions
|
||||
|
||||
# 14.4 - Outils modérateurs - Dashboard
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis connecté en tant que modérateur
|
||||
Et que j'ai accès au dashboard de modération
|
||||
|
||||
# Vue d'ensemble du dashboard
|
||||
|
||||
Scénario: Affichage du dashboard principal
|
||||
Étant donné que j'accède au dashboard de modération
|
||||
Quand la page se charge
|
||||
Alors je vois les sections principales:
|
||||
| section | position | contenu |
|
||||
| En-tête | Haut | Logo, nom utilisateur, rôle (Junior/Senior)|
|
||||
| Statistiques globales | Bandeau haut | Signalements en attente, traités aujourd'hui, temps moyen |
|
||||
| File d'attente prioritaire | Gauche | Signalements CRITIQUES et HAUTE priorité |
|
||||
| File d'attente normale | Centre | Signalements MOYENNE et BASSE priorité |
|
||||
| Fil d'activité | Droite | Actions récentes de l'équipe |
|
||||
| Navigation | Sidebar gauche | Signalements, Sanctions, Appels, Stats |
|
||||
Et toutes les sections sont chargées en <2 secondes
|
||||
|
||||
Scénario: Statistiques globales en temps réel
|
||||
Étant donné que je consulte les statistiques du dashboard
|
||||
Quand je vérifie les KPIs affichés
|
||||
Alors je vois les métriques suivantes:
|
||||
| métrique | valeur exemple | mise à jour |
|
||||
| Signalements en attente | 42 | Temps réel |
|
||||
| Signalements traités aujourd'hui | 138 | Temps réel |
|
||||
| Temps moyen de traitement | 45 min | Toutes les 5min|
|
||||
| Mon temps moyen (personnel) | 38 min | Toutes les 5min|
|
||||
| SLA respecté (24h) | 94% | Temps réel |
|
||||
Et les métriques s'actualisent automatiquement
|
||||
Et un badge de notification clignote si >50 signalements en attente
|
||||
|
||||
# Files d'attente séparées par priorité
|
||||
|
||||
Scénario: File d'attente CRITIQUE (24/7)
|
||||
Étant donné que 5 signalements de priorité CRITIQUE sont en attente
|
||||
Quand j'affiche la file CRITIQUE
|
||||
Alors je vois une liste rouge avec les signalements:
|
||||
| colonne | contenu exemple | ordre tri |
|
||||
| Priorité score | 95 (badge rouge "URGENT") | Score décroissant|
|
||||
| Titre contenu | "Podcast #42" | - |
|
||||
| Catégorie IA | 🚫 Haine & violence (97%) | - |
|
||||
| Signalé par | @user123 (⭐ Or) + 3 autres | - |
|
||||
| Temps écoulé | "Il y a 45 min" (rouge si >1h) | - |
|
||||
| Actions rapides | [Écouter] [Valider] [Rejeter] | - |
|
||||
Et la file CRITIQUE est toujours visible en haut de page
|
||||
Et une alerte sonore se déclenche si nouveau signalement CRITIQUE
|
||||
|
||||
Scénario: File d'attente HAUTE priorité
|
||||
Étant donné que 15 signalements de priorité HAUTE sont en attente
|
||||
Quand j'affiche la file HAUTE
|
||||
Alors je vois une liste orange avec les mêmes colonnes
|
||||
Et les signalements sont triés par score de priorité décroissant
|
||||
Et un compteur "⏰ 23h restantes pour SLA 24h" s'affiche
|
||||
Et la file s'actualise toutes les 30 secondes
|
||||
|
||||
Scénario: File d'attente MOYENNE et BASSE
|
||||
Étant donné que 20 signalements MOYENNE et 10 BASSE sont en attente
|
||||
Quand j'affiche ces files
|
||||
Alors elles sont regroupées dans un onglet "Autres signalements"
|
||||
Et je peux filtrer par priorité MOYENNE ou BASSE
|
||||
Et ces signalements sont traités après les priorités hautes
|
||||
|
||||
# Badge qualité du signaleur
|
||||
|
||||
Scénario: Identification des signaleurs de confiance
|
||||
Étant donné qu'un signalement provient d'un utilisateur Badge Or
|
||||
Quand j'affiche la file d'attente
|
||||
Alors je vois le badge "⭐ Or" à côté du pseudo
|
||||
Et un tooltip s'affiche:
|
||||
"""
|
||||
Utilisateur de confiance
|
||||
Score fiabilité: 95/100
|
||||
Historique: 54 signalements validés / 60 envoyés (90%)
|
||||
"""
|
||||
Et je sais que ce signalement est probablement pertinent
|
||||
|
||||
Scénario: Signalements multiples du même contenu
|
||||
Étant donné qu'un contenu a été signalé par 6 utilisateurs
|
||||
Quand j'affiche le signalement
|
||||
Alors je vois "Signalé par @user1 + 5 autres"
|
||||
Et je peux cliquer pour voir la liste complète:
|
||||
| signaleur | badge | catégorie choisie | commentaire |
|
||||
| @user1 | Or | Haine & violence | "Propos à 2:30" |
|
||||
| @user2 | Argent| Haine & violence | "Discriminatoire" |
|
||||
| @user3 | - | Haine & violence | "" |
|
||||
| @user4 | Bronze| Fausse info | "Désinformation" |
|
||||
| @user5 | - | Autre | "Contenu choquant" |
|
||||
| @user6 | Or | Haine & violence | "Passage 2:25-2:45" |
|
||||
Et je vois que 5/6 signaleurs ont choisi la même catégorie
|
||||
Et cela renforce la probabilité de violation
|
||||
|
||||
# Filtres et recherche
|
||||
|
||||
Scénario: Filtrer les signalements par catégorie
|
||||
Étant donné que je suis sur le dashboard
|
||||
Quand je clique sur le filtre "Catégorie"
|
||||
Alors je vois les 7 catégories:
|
||||
| catégorie | nombre en attente |
|
||||
| 🚫 Haine & violence | 12 |
|
||||
| 🔞 Contenu sexuel | 5 |
|
||||
| ⚖️ Illégalité | 2 |
|
||||
| 🎵 Droits d'auteur | 8 |
|
||||
| 📧 Spam | 15 |
|
||||
| ❌ Fausse information | 7 |
|
||||
| 🔧 Autre | 3 |
|
||||
Et je peux cliquer pour filtrer par catégorie
|
||||
Et le filtre s'applique instantanément
|
||||
|
||||
Scénario: Rechercher un signalement spécifique
|
||||
Étant donné que je veux rechercher un signalement
|
||||
Quand je tape "podcast" dans la barre de recherche
|
||||
Alors les résultats s'affichent en temps réel:
|
||||
| recherche dans |
|
||||
| Titre du contenu |
|
||||
| Pseudo du créateur |
|
||||
| Commentaires signaleurs |
|
||||
| Numéro de ticket |
|
||||
Et les résultats sont mis en évidence
|
||||
Et je peux cliquer pour ouvrir le signalement
|
||||
|
||||
Scénario: Filtrer par assignation
|
||||
Étant donné que je suis modérateur junior
|
||||
Quand je clique sur le filtre "Assignation"
|
||||
Alors je vois les options:
|
||||
| option | nombre |
|
||||
| Assignés à moi | 8 |
|
||||
| Non assignés | 25 |
|
||||
| Assignés à d'autres | 9 |
|
||||
| Tous | 42 |
|
||||
Et je peux voir uniquement mes signalements
|
||||
Et je peux m'auto-assigner un signalement non assigné
|
||||
|
||||
# Actions rapides depuis la liste
|
||||
|
||||
Scénario: Actions rapides sans ouvrir le détail
|
||||
Étant donné que je vois un signalement évident (spam)
|
||||
Et que le score IA est de 98%
|
||||
Quand j'utilise les actions rapides
|
||||
Alors je peux cliquer sur:
|
||||
| action | raccourci clavier | effet |
|
||||
| Écouter | E | Lance le player audio |
|
||||
| Approuver | A | Valide le signalement |
|
||||
| Rejeter | R | Rejette le signalement |
|
||||
| Escalade | S (Senior) | Transfère à un modérateur senior|
|
||||
| Détails | D | Ouvre la page détaillée |
|
||||
Et l'action est immédiate
|
||||
Et le signalement disparaît de la liste
|
||||
|
||||
Scénario: Validation rapide avec confirmation
|
||||
Étant donné que je clique sur "Approuver" (A)
|
||||
Quand l'action est déclenchée
|
||||
Alors une modal de confirmation s'affiche:
|
||||
"""
|
||||
Valider ce signalement ?
|
||||
|
||||
Action: Retirer le contenu + Strike 1 au créateur
|
||||
Contenu: "Podcast #42" par @createur
|
||||
|
||||
[Annuler] [Confirmer]
|
||||
"""
|
||||
Et je peux confirmer avec Entrée ou cliquer
|
||||
Et si je confirme, l'action est immédiate
|
||||
Et le signalement passe en "Traité"
|
||||
|
||||
# Fil d'activité en temps réel
|
||||
|
||||
Scénario: Affichage du fil d'activité de l'équipe
|
||||
Étant donné que je consulte le fil d'activité
|
||||
Quand je vérifie les dernières actions
|
||||
Alors je vois les actions récentes de l'équipe en temps réel:
|
||||
"""
|
||||
Il y a 2 min - @mod_alice a validé signalement #12345 (Spam)
|
||||
Il y a 5 min - @mod_bob a rejeté signalement #12344 (Non fondé)
|
||||
Il y a 8 min - @mod_charlie a escaladé signalement #12343 (Complexe)
|
||||
Il y a 12 min - @mod_alice a approuvé appel #APP-456
|
||||
"""
|
||||
Et le fil se met à jour en temps réel (WebSocket)
|
||||
Et je vois qui travaille sur quoi
|
||||
Et cela améliore la collaboration
|
||||
|
||||
Scénario: Collaboration sur cas complexes
|
||||
Étant donné qu'un modérateur senior travaille sur un cas complexe
|
||||
Quand il ajoute un commentaire interne
|
||||
Alors le commentaire apparaît dans le fil d'activité:
|
||||
"""
|
||||
@mod_senior a commenté le signalement #12350:
|
||||
"Besoin d'un second avis sur ce cas. Passage 3:42 borderline."
|
||||
"""
|
||||
Et je peux cliquer pour voir le signalement
|
||||
Et je peux répondre au commentaire
|
||||
Et cela facilite l'entraide entre modérateurs
|
||||
|
||||
# Statistiques personnelles
|
||||
|
||||
Scénario: Voir mes statistiques personnelles
|
||||
Étant donné que je clique sur mon profil modérateur
|
||||
Quand j'accède à mes statistiques
|
||||
Alors je vois:
|
||||
| métrique | valeur | période |
|
||||
| Signalements traités | 342 | Ce mois |
|
||||
| Temps moyen de traitement | 38 min | Ce mois |
|
||||
| Précision (appels rejetés) | 94% | Ce mois |
|
||||
| Signalements/jour | 18 | Moyenne 30j |
|
||||
| Médaille de performance | 🥈 Argent | - |
|
||||
Et je peux comparer avec la moyenne de l'équipe
|
||||
Et cela me motive à améliorer mes performances
|
||||
|
||||
Plan du Scénario: Médailles de performance modérateur
|
||||
Étant donné que mon temps moyen est de <temps> min
|
||||
Et que ma précision est de <precision>%
|
||||
Quand le système calcule ma médaille
|
||||
Alors je reçois la médaille "<medaille>"
|
||||
|
||||
Exemples:
|
||||
| temps | precision | medaille |
|
||||
| 25 | 97 | 🥇 Or (Top performer) |
|
||||
| 35 | 92 | 🥈 Argent (Bon) |
|
||||
| 50 | 85 | 🥉 Bronze (Standard) |
|
||||
|
||||
# Notifications et alertes
|
||||
|
||||
Scénario: Alerte sonore pour signalement CRITIQUE
|
||||
Étant donné que je travaille sur le dashboard
|
||||
Quand un nouveau signalement CRITIQUE arrive
|
||||
Alors une alerte sonore se déclenche (bip urgent)
|
||||
Et une notification desktop s'affiche:
|
||||
"""
|
||||
🚨 Nouveau signalement CRITIQUE
|
||||
Contenu: "Podcast #XX" - Violence
|
||||
[Traiter maintenant]
|
||||
"""
|
||||
Et le signalement apparaît en tête de liste (fond rouge)
|
||||
Et je suis immédiatement alerté
|
||||
|
||||
Scénario: Notification si SLA bientôt dépassé
|
||||
Étant donné qu'un signalement HAUTE priorité est en attente depuis 22h
|
||||
Quand il reste 2h avant le SLA de 24h
|
||||
Alors une notification s'affiche:
|
||||
"""
|
||||
⚠️ SLA bientôt dépassé
|
||||
Signalement #12345 - Haine & violence
|
||||
Deadline dans 2h
|
||||
[Prendre en charge]
|
||||
"""
|
||||
Et le signalement est mis en évidence en orange
|
||||
Et je peux cliquer pour le traiter en priorité
|
||||
|
||||
# Auto-refresh et temps réel
|
||||
|
||||
Scénario: Actualisation automatique des données
|
||||
Étant donné que je suis sur le dashboard
|
||||
Quand de nouvelles données arrivent
|
||||
Alors le dashboard s'actualise automatiquement:
|
||||
| donnée | fréquence actualisation |
|
||||
| File d'attente | 30 secondes |
|
||||
| Statistiques globales | 5 minutes |
|
||||
| Fil d'activité | Temps réel (WebSocket) |
|
||||
| Mon temps moyen | 5 minutes |
|
||||
Et je n'ai pas besoin de rafraîchir manuellement
|
||||
Et les changements s'affichent avec une animation subtile
|
||||
|
||||
# Responsive et performance
|
||||
|
||||
Scénario: Dashboard responsive pour écrans larges
|
||||
Étant donné que j'utilise un écran 27" (2560x1440)
|
||||
Quand j'affiche le dashboard
|
||||
Alors les 3 colonnes sont affichées côte à côte:
|
||||
| colonne | largeur |
|
||||
| File prioritaire | 30% |
|
||||
| File normale | 45% |
|
||||
| Fil d'activité | 25% |
|
||||
Et je vois tout en un seul coup d'œil
|
||||
Et je peux travailler efficacement
|
||||
|
||||
Scénario: Dashboard sur écran standard (1920x1080)
|
||||
Étant donné que j'utilise un écran Full HD
|
||||
Quand j'affiche le dashboard
|
||||
Alors les colonnes s'adaptent:
|
||||
| colonne | largeur | position |
|
||||
| File prioritaire | 60% | Gauche |
|
||||
| Fil d'activité | 40% | Droite |
|
||||
Et je peux basculer entre files avec onglets
|
||||
Et l'UX reste fluide
|
||||
|
||||
Scénario: Performance du dashboard
|
||||
Étant donné que 100 signalements sont en attente
|
||||
Quand je charge le dashboard
|
||||
Alors le chargement initial prend <2 secondes
|
||||
Et l'affichage est fluide (60 FPS)
|
||||
Et la pagination charge 20 signalements à la fois
|
||||
Et le scroll est instantané
|
||||
Et la mémoire utilisée reste <500 MB
|
||||
|
||||
# Dark mode pour modérateurs
|
||||
|
||||
Scénario: Support du dark mode
|
||||
Étant donné que je travaille de nuit
|
||||
Quand j'active le dark mode
|
||||
Alors les couleurs s'adaptent:
|
||||
| élément | couleur light | couleur dark |
|
||||
| Fond page | Blanc | Noir (#1E1E1E) |
|
||||
| Cartes signalements | Gris clair | Gris foncé |
|
||||
| Badge CRITIQUE | Rouge vif | Rouge (#FF4444) |
|
||||
| Badge HAUTE | Orange | Orange (#FFA500) |
|
||||
| Texte principal | Noir | Blanc |
|
||||
Et le contraste reste optimal
|
||||
Et mes yeux sont moins fatigués
|
||||
|
||||
# Accessibilité
|
||||
|
||||
Scénario: Raccourcis clavier pour productivité
|
||||
Étant donné que je suis sur le dashboard
|
||||
Quand j'utilise les raccourcis clavier
|
||||
Alors je peux naviguer rapidement:
|
||||
| raccourci | action |
|
||||
| A | Approuver le signalement sélectionné|
|
||||
| R | Rejeter le signalement sélectionné |
|
||||
| E | Écouter le contenu |
|
||||
| D | Ouvrir les détails |
|
||||
| S | Escalader (modérateur senior) |
|
||||
| ↑ / ↓ | Naviguer dans la liste |
|
||||
| Entrée | Ouvrir le signalement sélectionné |
|
||||
| Échap | Fermer la modal/retour |
|
||||
Et je gagne en productivité (×2-3)
|
||||
|
||||
# Coût infrastructure
|
||||
|
||||
Scénario: Coût du dashboard de modération
|
||||
Étant donné que le dashboard est développé et déployé
|
||||
Quand on évalue le coût
|
||||
Alors le coût de développement est:
|
||||
| composant | technologie | coût |
|
||||
| Frontend | React + TanStack Table | 0€ (interne) |
|
||||
| Backend API | Go (existant) | 0€ |
|
||||
| WebSocket temps réel | Go + Redis | 0-20€/mois |
|
||||
| Hébergement dashboard | OVH (serveur existant) | 0€ (mutualisé) |
|
||||
Et le coût total est de 0-20€/mois
|
||||
Et c'est inclus dans l'infrastructure existante
|
||||
461
docs/domains/moderation/features/admin/outils-moderateur.feature
Normal file
461
docs/domains/moderation/features/admin/outils-moderateur.feature
Normal file
@@ -0,0 +1,461 @@
|
||||
# language: fr
|
||||
|
||||
@admin @moderation @outils
|
||||
Fonctionnalité: Outils modérateur - Player audio et actions
|
||||
En tant que modérateur
|
||||
Je veux disposer d'outils performants pour traiter les signalements
|
||||
Afin de travailler efficacement et prendre des décisions éclairées
|
||||
|
||||
# 14.4 - Outils modérateurs - Player audio, historique créateur, etc.
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis connecté en tant que modérateur
|
||||
Et que j'examine un signalement
|
||||
|
||||
# Page détaillée d'un signalement
|
||||
|
||||
Scénario: Affichage de la page détails signalement
|
||||
Étant donné que je clique sur un signalement
|
||||
Quand la page de détails s'affiche
|
||||
Alors je vois toutes les sections:
|
||||
| section | position | contenu |
|
||||
| En-tête | Haut | Titre contenu, créateur, priorité |
|
||||
| Analyse IA | Bandeau | Score IA, catégorie détectée, confiance |
|
||||
| Player audio + waveform | Centre-haut | Lecture audio avec visualisation |
|
||||
| Transcription | Centre | Texte avec passages surlignés |
|
||||
| Détails signalements | Droite | Liste signaleurs + commentaires |
|
||||
| Historique créateur | Bas-droite | Contenus précédents, strikes, stats |
|
||||
| Actions modérateur | Bas | Approuver, Rejeter, Escalader, Commenter |
|
||||
Et toutes les sections sont chargées en <1 seconde
|
||||
|
||||
Scénario: En-tête avec informations clés
|
||||
Étant donné que j'affiche les détails d'un signalement
|
||||
Quand je consulte l'en-tête
|
||||
Alors je vois:
|
||||
| information | exemple | position |
|
||||
| Numéro ticket | #MOD-2026-00142 | Haut gauche |
|
||||
| Titre du contenu | "Podcast #42 - Titre" | Titre principal|
|
||||
| Créateur | @pseudo_createur (lien profil) | Sous-titre |
|
||||
| Catégorie contenu | 🎙️ Podcast | Tag |
|
||||
| Date publication | Publié le 15/01/2026 | Sous-titre |
|
||||
| Durée audio | 12:34 | Badge |
|
||||
| Priorité signalement | 🔴 CRITIQUE (score 95) | Haut droite |
|
||||
| Temps écoulé | Signalé il y a 2h | Badge orange |
|
||||
| Assigné à | @mod_alice (si assigné) | Badge bleu |
|
||||
Et je vois en un coup d'œil les informations essentielles
|
||||
|
||||
# Analyse IA avec détails
|
||||
|
||||
Scénario: Bandeau analyse IA
|
||||
Étant donné que l'IA a analysé le contenu
|
||||
Quand j'affiche le bandeau d'analyse
|
||||
Alors je vois les résultats:
|
||||
"""
|
||||
🤖 Analyse IA
|
||||
|
||||
Score de confiance: 97% 🔴 (Très élevé)
|
||||
Catégorie détectée: 🚫 Haine & violence
|
||||
Passages problématiques: 3 détectés
|
||||
|
||||
Détails analyses:
|
||||
- Analyse sentiment: Négatif (score: -0.85)
|
||||
- Détection haine: Positif (score: 0.92)
|
||||
- Mots-clés interdits: 5 occurrences
|
||||
|
||||
[Voir détails techniques]
|
||||
"""
|
||||
Et un fond rouge clair indique un score élevé (>90%)
|
||||
Et je peux avoir confiance dans l'analyse IA
|
||||
|
||||
Scénario: Détails techniques de l'analyse IA
|
||||
Étant donné que je clique sur "Voir détails techniques"
|
||||
Quand la modal s'affiche
|
||||
Alors je vois les détails complets:
|
||||
| analyse | modèle | score | timestamp analyse |
|
||||
| Transcription | Whisper large-v3 | 100% | 14:32:15 |
|
||||
| Analyse sentiment | distilbert-base-uncased | -0.85 | 14:33:42 |
|
||||
| Détection haine | facebook/roberta-hate-speech | 0.92 | 14:33:58 |
|
||||
| Mots-clés interdits | Liste noire FR/EN | 5 hits | 14:34:01 |
|
||||
Et je peux vérifier la fiabilité de l'analyse
|
||||
Et cela m'aide à prendre une décision
|
||||
|
||||
# Player audio avec waveform
|
||||
|
||||
Scénario: Affichage du player audio Wavesurfer.js
|
||||
Étant donné que j'ouvre la page de détails
|
||||
Quand le player audio se charge
|
||||
Alors je vois le player avec waveform:
|
||||
| élément | description |
|
||||
| Waveform | Visualisation audio complète |
|
||||
| Passages surlignés | Zones détectées par IA en rouge |
|
||||
| Contrôles | Play/Pause, volume, vitesse |
|
||||
| Timeline | 00:00 / 12:34 |
|
||||
| Marqueurs | Annotations aux timestamps problématiques |
|
||||
| Vitesse lecture | 0.75x, 1x, 1.5x, 2x |
|
||||
Et je peux écouter le contenu directement
|
||||
Et je peux me concentrer sur les passages signalés
|
||||
|
||||
Scénario: Navigation rapide vers passages problématiques
|
||||
Étant donné que l'IA a détecté 3 passages problématiques
|
||||
Quand j'affiche le player
|
||||
Alors je vois 3 marqueurs rouges sur la waveform:
|
||||
| timestamp | type marqueur | description |
|
||||
| 02:15 | Rouge IA (97%) | "Insulte discriminatoire" |
|
||||
| 03:42 | Rouge IA (92%) | "Propos haineux" |
|
||||
| 08:20 | Orange signaleur | "Commentaire @user: 'ici aussi'"|
|
||||
Et je peux cliquer sur un marqueur pour sauter directement
|
||||
Et je gagne un temps précieux (pas besoin d'écouter tout)
|
||||
|
||||
Scénario: Lecture accélérée pour gain productivité
|
||||
Étant donné que le contenu dure 30 minutes
|
||||
Quand je sélectionne la vitesse 2x
|
||||
Alors l'audio est accéléré sans déformation
|
||||
Et je peux écouter en 15 minutes au lieu de 30
|
||||
Et je peux revenir à 1x si nécessaire
|
||||
Et cela multiplie ma productivité par 2
|
||||
|
||||
Scénario: Annotations directes sur la waveform
|
||||
Étant donné que j'écoute le contenu
|
||||
Et que je détecte un passage problématique à 05:30
|
||||
Quand je clique sur la waveform à 05:30
|
||||
Alors une modal s'affiche:
|
||||
"""
|
||||
Ajouter une annotation
|
||||
|
||||
Timestamp: 05:30
|
||||
Type: [Passage problématique ▼]
|
||||
Note: [Champ texte]
|
||||
|
||||
[Annuler] [Ajouter]
|
||||
"""
|
||||
Et je peux marquer le passage pour référence
|
||||
Et l'annotation apparaît sur la waveform
|
||||
Et elle sera visible dans le rapport de modération
|
||||
|
||||
# Transcription avec surlignage
|
||||
|
||||
Scénario: Affichage de la transcription complète
|
||||
Étant donné que l'IA a transcrit l'audio
|
||||
Quand j'affiche la transcription
|
||||
Alors je vois le texte complet:
|
||||
"""
|
||||
[00:00] Bonjour à tous, bienvenue dans ce podcast...
|
||||
[02:15] ...et c'est pourquoi je pense que [ROUGE: phrase discriminatoire] mais bon...
|
||||
[03:42] ...vraiment, ces gens [ROUGE: propos haineux], vous voyez...
|
||||
[08:20] ...en conclusion, [ORANGE: passage signalé par @user]...
|
||||
"""
|
||||
Et les passages problématiques sont surlignés
|
||||
Et je peux lire sans écouter (plus rapide)
|
||||
Et je peux copier/coller pour le rapport
|
||||
|
||||
Scénario: Synchronisation transcription - audio
|
||||
Étant donné que je lis la transcription
|
||||
Quand je clique sur un timestamp dans la transcription
|
||||
Alors le player audio saute à ce timestamp
|
||||
Et la lecture démarre automatiquement
|
||||
Et la transcription scroll pour suivre la lecture
|
||||
Et je peux alterner lecture et écoute facilement
|
||||
|
||||
Scénario: Recherche dans la transcription
|
||||
Étant donné que la transcription est affichée
|
||||
Quand je recherche un mot-clé "discriminatoire"
|
||||
Alors toutes les occurrences sont surlignées en jaune
|
||||
Et je vois "3 résultats trouvés"
|
||||
Et je peux naviguer entre les résultats avec ←/→
|
||||
Et je trouve rapidement les passages pertinents
|
||||
|
||||
# Détails des signalements
|
||||
|
||||
Scénario: Liste des signaleurs et leurs commentaires
|
||||
Étant donné qu'un contenu a été signalé par 6 utilisateurs
|
||||
Quand j'affiche la section "Signalements"
|
||||
Alors je vois la liste complète:
|
||||
| signaleur | badge | fiabilité | catégorie | commentaire | date |
|
||||
| @user1 | 🥇 Or | 95% | Haine & violence | "Propos à 2:30" | Il y a 2h |
|
||||
| @user2 | 🥈 Ag | 87% | Haine & violence | "Discriminatoire 2:15" | Il y a 1h |
|
||||
| @user3 | - | 45% | Haine & violence | "" | Il y a 45min|
|
||||
| @user4 | 🥉 Br | 72% | Fausse info | "Désinformation santé" | Il y a 30min|
|
||||
| @user5 | - | 20% | Autre | "Contenu choquant" | Il y a 15min|
|
||||
| @user6 | 🥇 Or | 92% | Haine & violence | "Passage 2:25-2:45" | Il y a 10min|
|
||||
Et je vois que 5/6 ont choisi "Haine & violence"
|
||||
Et les utilisateurs de confiance sont mis en évidence
|
||||
Et je peux cliquer sur un commentaire pour sauter au timestamp
|
||||
|
||||
Scénario: Consensus des signaleurs
|
||||
Étant donné que 6 signalements sont affichés
|
||||
Quand je consulte l'analyse de consensus
|
||||
Alors je vois:
|
||||
"""
|
||||
📊 Consensus des signaleurs
|
||||
|
||||
Catégorie majoritaire: 🚫 Haine & violence (5/6 = 83%)
|
||||
Signaleurs de confiance: 3/6 (Or × 2, Argent × 1)
|
||||
Timestamps mentionnés: 2:15, 2:25-2:45, 2:30
|
||||
|
||||
→ Fort consensus sur la catégorie et les timestamps
|
||||
"""
|
||||
Et je peux prendre une décision plus facilement
|
||||
|
||||
# Historique créateur - Vue 360°
|
||||
|
||||
Scénario: Affichage de l'historique du créateur
|
||||
Étant donné que j'examine un signalement
|
||||
Quand j'affiche l'historique du créateur @pseudo
|
||||
Alors je vois sa vue 360°:
|
||||
| section | contenu |
|
||||
| Statistiques globales | 42 contenus, 12K écoutes, membre depuis 8 mois |
|
||||
| Strikes actuels | 1/4 strikes (1 actif, 0 réhabilité) |
|
||||
| Historique sanctions | Liste des 3 dernières sanctions |
|
||||
| Contenus récents | 10 derniers contenus publiés |
|
||||
| Score de confiance | 65/100 (Créateur suspect) |
|
||||
| Signalements reçus | 8 signalements dont 3 validés |
|
||||
Et je vois si c'est un récidiviste ou un premier incident
|
||||
|
||||
Scénario: Historique des strikes
|
||||
Étant donné que le créateur a 1 strike actif
|
||||
Quand je consulte les détails des strikes
|
||||
Alors je vois:
|
||||
"""
|
||||
Strikes: 1/4 actifs
|
||||
|
||||
Historique:
|
||||
✓ Strike 1 - Il y a 3 mois
|
||||
Catégorie: Spam
|
||||
Sanction: Avertissement
|
||||
Statut: Actif (réhabilitation dans 3 mois si pas de récidive)
|
||||
|
||||
Strikes réhabilités:
|
||||
[Aucun]
|
||||
|
||||
Escalade suivante:
|
||||
- Strike 2: Suspension 7 jours
|
||||
- Strike 3: Suspension 30 jours
|
||||
- Strike 4: Ban définitif
|
||||
"""
|
||||
Et je vois l'historique complet
|
||||
Et je peux décider de la sanction appropriée
|
||||
|
||||
Scénario: Contenus récents du créateur
|
||||
Étant donné que j'affiche les contenus récents
|
||||
Quand je consulte la liste
|
||||
Alors je vois les 10 derniers contenus:
|
||||
| titre | date | écoutes | signalements | statut |
|
||||
| Podcast #42 | 15/01/2026 | 342 | 6 (en cours) | Signalé |
|
||||
| Podcast #41 | 10/01/2026 | 521 | 0 | Publié |
|
||||
| Podcast #40 | 05/01/2026 | 678 | 1 (rejeté) | Publié |
|
||||
| Podcast #39 | 01/01/2026 | 445 | 0 | Publié |
|
||||
Et je peux écouter rapidement un contenu précédent
|
||||
Et je peux détecter un pattern de comportement
|
||||
|
||||
Scénario: Détection de pattern récidiviste
|
||||
Étant donné que le créateur a 3 contenus signalés validés en 2 mois
|
||||
Quand le système analyse le pattern
|
||||
Alors une alerte s'affiche:
|
||||
"""
|
||||
⚠️ Pattern récidiviste détecté
|
||||
|
||||
3 signalements validés en 2 mois:
|
||||
- 15/01: Haine & violence (en cours)
|
||||
- 28/12: Spam (validé - Strike 1)
|
||||
- 10/12: Fausse info (validé)
|
||||
|
||||
Recommandation: Sanction renforcée suggérée
|
||||
"""
|
||||
Et je peux décider d'une sanction plus sévère
|
||||
Et je protège la communauté des récidivistes
|
||||
|
||||
# Actions modérateur
|
||||
|
||||
Scénario: Actions disponibles pour modérateur junior
|
||||
Étant donné que je suis modérateur junior
|
||||
Quand j'affiche les actions disponibles
|
||||
Alors je vois les boutons:
|
||||
| action | raccourci | couleur | description |
|
||||
| Approuver | A | Rouge | Valider le signalement + sanction |
|
||||
| Rejeter | R | Gris | Rejeter le signalement (non fondé) |
|
||||
| Escalader senior | S | Orange | Transférer à un modérateur senior |
|
||||
| Commenter | C | Bleu | Ajouter un commentaire interne |
|
||||
| Mettre en attente | W | Jaune | Reporter la décision (max 24h) |
|
||||
Et je peux traiter les cas simples
|
||||
Et je peux escalader les cas complexes
|
||||
|
||||
Scénario: Actions supplémentaires pour modérateur senior
|
||||
Étant donné que je suis modérateur senior
|
||||
Quand j'affiche les actions disponibles
|
||||
Alors je vois des actions supplémentaires:
|
||||
| action | description |
|
||||
| Approuver avec sanction | Valider + choisir sanction personnalisée |
|
||||
| Ban temporaire | Suspendre le créateur (7j/30j) |
|
||||
| Ban définitif | Bannir définitivement le créateur |
|
||||
| Réhabiliter strike | Retirer un strike (après appel) |
|
||||
| Contacter autorités | Signaler aux autorités (cas graves) |
|
||||
Et je peux gérer les cas complexes et graves
|
||||
|
||||
Scénario: Workflow approbation signalement
|
||||
Étant donné que je clique sur "Approuver" (A)
|
||||
Quand le workflow s'affiche
|
||||
Alors je vois les étapes:
|
||||
"""
|
||||
1️⃣ Choisir la sanction
|
||||
|
||||
Sanction suggérée (IA): Strike 2 + Suspension 7j
|
||||
[Radio buttons]
|
||||
○ Strike 1 - Avertissement
|
||||
● Strike 2 - Suspension 7 jours (recommandé)
|
||||
○ Strike 3 - Suspension 30 jours
|
||||
○ Autre (personnalisé)
|
||||
|
||||
2️⃣ Confirmer l'action
|
||||
|
||||
Actions qui seront effectuées:
|
||||
✓ Contenu retiré de la plateforme
|
||||
✓ Strike 2 ajouté au créateur
|
||||
✓ Créateur suspendu 7 jours
|
||||
✓ Notifications envoyées (push + email)
|
||||
✓ Signaleurs notifiés (validation)
|
||||
|
||||
[Annuler] [Confirmer et appliquer]
|
||||
"""
|
||||
Et je peux personnaliser la sanction si nécessaire
|
||||
Et je confirme avant d'appliquer
|
||||
|
||||
Scénario: Workflow rejet signalement
|
||||
Étant donné que je clique sur "Rejeter" (R)
|
||||
Quand le workflow s'affiche
|
||||
Alors je dois fournir une raison:
|
||||
"""
|
||||
Rejeter ce signalement
|
||||
|
||||
Raison du rejet: [Liste déroulante]
|
||||
▼ Choisir une raison
|
||||
- Contenu conforme aux règles
|
||||
- Contexte éducatif/artistique
|
||||
- Signalement abusif
|
||||
- Autre (préciser)
|
||||
|
||||
Commentaire (optionnel): [Champ texte]
|
||||
|
||||
Actions qui seront effectuées:
|
||||
✓ Signalement marqué comme "Rejeté"
|
||||
✓ Contenu reste en ligne
|
||||
✓ Signaleurs notifiés avec raison
|
||||
✓ Fiabilité signaleur ajustée (-5%)
|
||||
|
||||
[Annuler] [Confirmer le rejet]
|
||||
"""
|
||||
Et la raison est obligatoire
|
||||
Et les signaleurs recevront une explication
|
||||
|
||||
# Commentaires internes modérateurs
|
||||
|
||||
Scénario: Ajouter un commentaire interne
|
||||
Étant donné que je travaille sur un cas complexe
|
||||
Quand je clique sur "Commenter" (C)
|
||||
Alors une zone de commentaire s'affiche:
|
||||
"""
|
||||
Commentaire interne (visible uniquement par modérateurs)
|
||||
|
||||
[Champ texte riche]
|
||||
|
||||
Mentionner un collègue: @mod_
|
||||
|
||||
[Annuler] [Publier le commentaire]
|
||||
"""
|
||||
Et je peux mentionner un collègue avec @
|
||||
Et le commentaire apparaît dans le fil d'activité
|
||||
Et cela facilite la collaboration
|
||||
|
||||
Scénario: Fil de commentaires sur un signalement
|
||||
Étant donné qu'un signalement a 3 commentaires internes
|
||||
Quand j'affiche le fil de commentaires
|
||||
Alors je vois:
|
||||
"""
|
||||
💬 Commentaires internes (3)
|
||||
|
||||
@mod_alice - Il y a 1h
|
||||
"Passage à 2:30 borderline. Besoin d'un second avis @mod_senior"
|
||||
|
||||
@mod_senior - Il y a 30min
|
||||
"J'ai écouté. C'est clairement discriminatoire. Approuver avec Strike 2."
|
||||
|
||||
@mod_alice - Il y a 5min
|
||||
"OK merci ! Je valide."
|
||||
"""
|
||||
Et je vois l'historique des discussions
|
||||
Et cela améliore la qualité des décisions
|
||||
|
||||
# Logs d'audit
|
||||
|
||||
Scénario: Génération automatique des logs d'audit
|
||||
Étant donné que je valide un signalement
|
||||
Quand l'action est effectuée
|
||||
Alors un log d'audit complet est créé automatiquement:
|
||||
| champ | valeur |
|
||||
| signalement_id | #MOD-2026-00142 |
|
||||
| content_id | content_123456 |
|
||||
| moderator_id | mod_alice |
|
||||
| moderator_role | Junior |
|
||||
| action_taken | Approved - Strike 2 + Suspension 7d |
|
||||
| ia_score | 97% |
|
||||
| ia_category | Haine & violence |
|
||||
| priority | CRITIQUE |
|
||||
| processing_time | 12 minutes 34 secondes |
|
||||
| timestamp | 2026-01-15T14:42:18Z |
|
||||
| commentaires_internes | 2 commentaires |
|
||||
| annotations_audio | 3 annotations aux timestamps 2:15, 3:42, 8:20 |
|
||||
Et le log est conservé pour conformité DSA
|
||||
Et il sera anonymisé après 3 ans (RGPD)
|
||||
|
||||
Scénario: Export des logs d'audit
|
||||
Étant donné que je suis admin modération
|
||||
Quand je veux exporter les logs
|
||||
Alors je peux exporter en:
|
||||
| format | contenu | usage |
|
||||
| CSV | Tableau complet | Analyse Excel |
|
||||
| JSON | Données structurées | Analyse programmatique |
|
||||
| PDF | Rapport formaté | Audit DSA officiel |
|
||||
Et je peux filtrer par date, modérateur, action
|
||||
Et les logs sont conformes aux exigences légales
|
||||
|
||||
# Performance et UX
|
||||
|
||||
Scénario: Performance du player audio
|
||||
Étant donné que j'ouvre la page de détails
|
||||
Quand le player audio se charge
|
||||
Alors la waveform s'affiche en <2 secondes
|
||||
Et la transcription se charge en parallèle
|
||||
Et je peux commencer à écouter immédiatement
|
||||
Et le streaming HLS est fluide sans coupure
|
||||
Et l'UX est professionnelle et rapide
|
||||
|
||||
Scénario: Raccourcis clavier pour actions rapides
|
||||
Étant donné que je suis sur la page de détails
|
||||
Quand j'utilise les raccourcis clavier
|
||||
Alors je peux:
|
||||
| touche | action |
|
||||
| Espace | Play/Pause audio |
|
||||
| ← / → | Reculer/Avancer 5 secondes |
|
||||
| ↑ / ↓ | Augmenter/Diminuer volume |
|
||||
| A | Approuver |
|
||||
| R | Rejeter |
|
||||
| S | Escalader |
|
||||
| C | Commenter |
|
||||
| 1/2/3/4 | Vitesse 0.75x/1x/1.5x/2x |
|
||||
| M | Ajouter marqueur/annotation |
|
||||
| Échap | Retour au dashboard |
|
||||
Et je gagne en productivité
|
||||
|
||||
# Coût infrastructure
|
||||
|
||||
Scénario: Coût des outils modérateur
|
||||
Étant donné que tous les outils sont déployés
|
||||
Quand on évalue le coût
|
||||
Alors le coût est réparti ainsi:
|
||||
| composant | technologie | coût mensuel |
|
||||
| Player Wavesurfer.js | JavaScript (open source)| 0€ |
|
||||
| Transcription Whisper | Self-hosted (CPU/GPU) | 0-200€ |
|
||||
| Analyse NLP | Self-hosted | 0€ (inclus) |
|
||||
| Stockage transcriptions| PostgreSQL | 0€ (inclus) |
|
||||
| Logs audit | PostgreSQL | 0€ (inclus) |
|
||||
| Total | - | 0-200€/mois |
|
||||
Et le coût est largement compensé par la productivité ×3-5
|
||||
Reference in New Issue
Block a user