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:
jpgiannetti
2026-02-07 17:15:02 +01:00
parent 78422bb2c0
commit 5e5fcf4714
227 changed files with 1413 additions and 1967 deletions

View File

@@ -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

View 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