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,197 @@
# language: fr
Fonctionnalité: Architecture technique radio live
En tant que système
Je veux gérer efficacement les flux audio en temps réel
Afin d'assurer une diffusion stable et scalable des lives
Contexte:
Étant donné que l'infrastructure RoadWave est opérationnelle
Et que les serveurs Go avec Pion WebRTC sont actifs
Scénario: Ingestion WebRTC du flux créateur
Étant donné qu'un créateur démarre un live depuis son application mobile
Quand le flux audio WebRTC (Opus 48 kbps) arrive sur le serveur
Alors le serveur Go avec Pion WebRTC accepte la connexion
Et le flux est traité en temps réel
Scénario: Conversion temps réel Opus vers segments HLS
Étant donné qu'un flux WebRTC Opus est reçu par le serveur
Quand le serveur traite le flux
Alors FFmpeg convertit en segments HLS (.ts)
Et un fichier manifest .m3u8 est généré et mis à jour régulièrement
Et les segments ont une durée de 2 secondes chacun
Scénario: Distribution via NGINX Cache
Étant donné que les segments HLS sont générés
Quand un auditeur demande à rejoindre le live
Alors le manifest .m3u8 est servi via NGINX Cache (OVH)
Et les segments .ts sont cachés sur le cache NGINX
Et la distribution est globale avec latence minimale
Scénario: Lecture HLS native sur mobile iOS
Étant donné qu'un auditeur iOS rejoint un live
Quand l'application charge le flux HLS
Alors le player natif AVPlayer gère la lecture
Et le buffer de 15 secondes est appliqué automatiquement
Et la qualité s'adapte selon la connexion
Scénario: Lecture HLS native sur mobile Android
Étant donné qu'un auditeur Android rejoint un live
Quand l'application charge le flux HLS
Alors le player natif ExoPlayer gère la lecture
Et le buffer de 15 secondes est configuré
Et la qualité s'adapte selon la connexion
Scénario: Enregistrement parallèle du flux pour replay
Étant donné qu'un live est en cours
Alors un processus parallèle enregistre le flux Opus raw
Et l'enregistrement est stocké temporairement sur le serveur
Et l'enregistrement est indépendant de la diffusion HLS
Scénario: Traitement post-live asynchrone
Étant donné qu'un live vient de se terminer
Quand le processus post-live démarre
Alors un job asynchrone est créé dans la queue Redis
Et un worker Go récupère le job
Et le worker exécute FFmpeg pour les conversions
Scénario: Conversion Opus raw vers MP3 256 kbps
Étant donné qu'un worker traite un job post-live
Quand la conversion démarre
Alors FFmpeg convertit Opus raw en MP3 256 kbps
Et la normalisation audio à -14 LUFS est appliquée
Et les silences prolongés (>3 secondes) sont détectés et nettoyés
Scénario: Génération segments HLS pour le replay
Étant donné que le MP3 256 kbps est généré
Quand le worker crée les segments HLS
Alors des segments .ts de 10 secondes sont créés
Et un manifest .m3u8 est généré
Et les segments sont uploadés vers OVH Object Storage
Scénario: Publication automatique du replay
Étant donné que tous les segments HLS sont uploadés
Quand le worker finalise le job
Alors une entrée de contenu "replay" est créée en base PostgreSQL
Et le titre est "[REPLAY] [Titre live original]"
Et le type géographique est "Géo-neutre"
Et le replay est immédiatement disponible pour les auditeurs
Scénario: Suppression automatique fichier Opus raw après 7 jours
Étant donné qu'un replay est publié depuis 7 jours
Quand le job de nettoyage quotidien s'exécute
Alors le fichier Opus raw est supprimé du stockage
Et seul le MP3 256 kbps et les segments HLS sont conservés
Et l'espace de stockage est libéré
Scénario: Scalabilité horizontale des workers de conversion
Étant donné que 50 lives se terminent simultanément
Quand les jobs post-live sont créés
Alors les workers Go disponibles traitent les jobs en parallèle
Et si tous les workers sont occupés, les jobs attendent en queue Redis
Et de nouveaux workers peuvent être lancés automatiquement (Kubernetes)
Scénario: Limitation du nombre de lives simultanés (MVP)
Étant donné que l'infrastructure MVP est configurée pour 100 lives simultanés
Et que 100 lives sont actuellement en cours
Quand un nouveau créateur essaie de démarrer un live
Alors la demande est refusée avec le code erreur 503
Et le message "Capacité maximale atteinte. Veuillez réessayer dans quelques minutes" est retourné
Et la demande peut être mise en queue prioritaire si créateur Premium
Scénario: Monitoring des ressources serveur en temps réel
Étant donné que plusieurs lives sont en cours
Alors le système monitore en temps réel:
| métrique | seuil alerte |
| CPU utilisation | >80% |
| Mémoire utilisation | >85% |
| Bande passante upload | >80% capacité|
| Nombre connexions WebRTC | >90 |
| Latence moyenne CDN | >200ms |
Et si un seuil est dépassé, une alerte est envoyée à l'équipe technique
Scénario: Calcul du coût de bande passante CDN
Étant donné qu'un live a 100 auditeurs simultanés
Et que la qualité est 48 kbps Opus
Quand le live dure 1 heure
Alors la bande passante totale est d'environ 2.16 GB
Et le coût estimé infrastructure est d'environ 0.02
Et ces métriques sont enregistrées pour facturation créateur si nécessaire
Scénario: Cache NGINX des segments HLS
Étant donné qu'un live est diffusé via NGINX Cache
Quand un segment .ts est généré
Alors le segment est uploadé vers OVH Object Storage origin
Et NGINX Cache met en cache le segment
Et les auditeurs suivants récupèrent le segment depuis le cache
Et la charge sur le serveur origin est réduite de ~90%
Scénario: Gestion de la latence WebRTC créateur
Étant donné qu'un créateur diffuse avec une connexion 4G
Quand la latence réseau augmente ponctuellement
Alors le buffer côté serveur absorbe les fluctuations
Et la qualité peut être réduite temporairement (48 kbps 32 kbps)
Et un warning est affiché au créateur si la connexion est trop instable
Scénario: Détection automatique de la musique protégée (post-MVP)
Étant donné qu'un live contient de la musique en arrière-plan
Quand le système d'audio fingerprint analyse le flux
Alors une empreinte audio est calculée toutes les 30 secondes
Et l'empreinte est comparée à une base de données de contenus protégés
Et si une correspondance est trouvée, un warning est envoyé au créateur
Et si le créateur ne corrige pas sous 30 secondes, le live peut être arrêté
Scénario: Stockage des métadonnées de live en PostgreSQL
Étant donné qu'un créateur démarre un live
Alors les métadonnées suivantes sont enregistrées:
| champ | exemple valeur |
| live_id | uuid v4 |
| creator_id | uuid créateur |
| title | "Mon super live" |
| started_at | timestamp UTC |
| zone_geo | "Île-de-France" |
| tags | ["Actualité", "Tech"] |
| classification_age | "Tout public" |
Et ces données sont indexées pour recherche et analytics
Scénario: Cache Redis pour compteurs temps réel
Étant donné qu'un live est en cours
Alors Redis stocke les compteurs temps réel:
| clé Redis | valeur exemple |
| live:[live_id]:listeners | 247 |
| live:[live_id]:likes | 89 |
| live:[live_id]:reports | 0 |
Et ces compteurs sont mis à jour toutes les 2 secondes
Et les compteurs sont persistés en PostgreSQL toutes les 60 secondes
Scénario: Heartbeat auditeurs pour compteur précis
Étant donné qu'un auditeur écoute un live
Alors l'application envoie un heartbeat toutes les 10 secondes
Et le heartbeat met à jour le timestamp dans Redis
Et si aucun heartbeat n'est reçu pendant 30 secondes, l'auditeur est retiré du compteur
Scénario: Gestion des pannes serveur pendant un live
Étant donné qu'un live est en cours sur serveur A
Quand le serveur A tombe en panne
Alors Kubernetes redémarre automatiquement un pod
Mais le live en cours est perdu (pas de failover temps réel en MVP)
Et le créateur voit le message "Connexion perdue. Veuillez redémarrer le live"
Et les auditeurs voient "Le live est terminé suite à un problème technique"
Scénario: Backup automatique des enregistrements live
Étant donné qu'un live est enregistré en Opus raw
Quand l'enregistrement dépasse 10 minutes
Alors un backup incrémental est créé toutes les 10 minutes
Et le backup est stocké sur un stockage secondaire (S3-compatible)
Et en cas de crash serveur, le live peut être récupéré jusqu'au dernier backup
Scénario: Logs et audit trail des lives
Étant donné qu'un live démarre, se déroule et se termine
Alors tous les événements sont loggés:
| événement | détails enregistrés |
| Démarrage live | timestamp, creator_id, zone_geo |
| Auditeur rejoint | timestamp, user_id, position GPS |
| Auditeur quitte | timestamp, user_id, durée écoute |
| Signalement | timestamp, user_id, catégorie |
| Fin live | timestamp, durée totale, stats finales |
Et ces logs sont conservés 90 jours pour analytics et conformité RGPD

View File

@@ -0,0 +1,159 @@
# language: fr
Fonctionnalité: Arrêt du live
En tant que créateur
Je veux arrêter ma diffusion en direct de manière contrôlée
Afin de terminer proprement mon live et générer un replay automatiquement
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté en tant que créateur
Et que je diffuse actuellement un live
Scénario: Arrêt manuel avec compte à rebours 5 secondes
Quand j'appuie sur le bouton "Arrêter live"
Alors un compte à rebours de 5 secondes démarre
Et je vois le message "Ce live se termine dans 5... 4... 3... 2... 1"
Et un bouton "Annuler" est affiché pendant le décompte
Et l'audio du compte à rebours est diffusé aux auditeurs
Scénario: Annulation du compte à rebours
Étant donné que j'ai appuyé sur "Arrêter live"
Et que le compte à rebours affiche "3 secondes"
Quand j'appuie sur "Annuler"
Alors le compte à rebours s'arrête
Et le live continue normalement
Et aucune notification n'est envoyée aux auditeurs
Scénario: Arrêt effectif après compte à rebours
Étant donné que le compte à rebours est à 0
Alors le live s'arrête
Et la diffusion aux auditeurs se termine
Et le message "Live terminé" s'affiche
Et le processus de traitement post-live démarre automatiquement
Scénario: Déconnexion créateur courte (moins de 60 secondes)
Étant donné que je diffuse un live
Quand ma connexion est perdue pendant 30 secondes
Alors les auditeurs voient le message "Connexion créateur perdue, reconnexion en cours..."
Et le live continue de bufferer
Et quand ma connexion revient, le live reprend normalement
Scénario: Déconnexion créateur longue (60 secondes ou plus)
Étant donné que je diffuse un live
Quand ma connexion est perdue pendant 60 secondes
Alors le live s'arrête automatiquement
Et les auditeurs voient le message "Le live est terminé suite à une coupure de connexion"
Et le processus de traitement post-live démarre
Scénario: Enregistrement automatique pendant le live
Étant donné que je diffuse un live
Alors mon flux audio est enregistré en continu
Et le format d'enregistrement est Opus raw
Et l'enregistrement est stocké temporairement sur le serveur
Scénario: Génération automatique du replay après arrêt
Étant donné que mon live vient de se terminer
Et que l'option "Publier replay automatiquement" est activée (par défaut)
Quand le traitement post-live démarre
Alors un job asynchrone est créé
Et le job effectue les opérations suivantes:
| opération | détail |
| Conversion format | Opus raw MP3 256 kbps |
| Génération segments HLS | Segments .ts pour streaming |
| Normalisation volume | -14 LUFS |
| Détection silences prolongés | Nettoyage automatique |
Scénario: Publication du replay
Étant donné que le traitement post-live est terminé
Alors le replay est publié automatiquement sous 5 à 10 minutes
Et le titre est "[REPLAY] [Titre live original]"
Et la zone de diffusion est la même que le live
Et les tags sont identiques au live
Et la classification d'âge est identique
Et le type géographique est "Géo-neutre" (contenu pérenne)
Scénario: Notification de disponibilité du replay aux auditeurs
Étant donné que le replay de mon live est publié
Quand un auditeur qui a écouté le live se reconnecte
Alors il voit une notification in-app "Le replay de [Titre] est disponible"
Scénario: Option désactivation publication automatique replay
Étant donné que je configure un nouveau live
Quand je désactive l'option "Publier replay automatiquement"
Et que je démarre puis arrête le live
Alors le live est enregistré
Mais le replay n'est pas publié automatiquement
Et je peux décider manuellement de le publier plus tard
Scénario: Suppression manuelle du replay après publication
Étant donné que mon live a généré un replay publié
Quand j'accède à mes contenus
Alors je vois le replay dans ma liste
Et je peux le supprimer comme n'importe quel contenu
Quand je supprime le replay
Alors le fichier source Opus raw est supprimé immédiatement
Scénario: Conservation fichier source Opus raw
Étant donné que mon live est terminé
Et que le replay est publié
Alors le fichier Opus raw est conservé pendant 7 jours
Et après 7 jours, le fichier raw est supprimé automatiquement
Et seul le MP3 256 kbps est conservé
Scénario: Modification du replay interdite
Étant donné que mon live a généré un replay publié
Quand j'essaie de modifier l'audio du replay
Alors l'action est refusée
Et je vois le message "Les replays ne peuvent pas être modifiés pour garantir l'intégrité de l'enregistrement"
Et je peux uniquement modifier les métadonnées (titre, description)
Scénario: Statistiques du live disponibles après arrêt
Étant donné que mon live est terminé
Quand j'accède aux statistiques
Alors je vois:
| métrique | exemple valeur |
| Durée totale | 1h 23min |
| Nombre d'auditeurs max | 247 |
| Nombre d'auditeurs moyen | 183 |
| Nombre de likes | 89 |
| Nombre d'abonnements | 12 |
| Signalements reçus | 0 |
Scénario: Live terminé avec signalements en cours
Étant donné que mon live a reçu 3 signalements pendant la diffusion
Quand le live se termine
Alors le replay n'est pas publié automatiquement
Et le contenu est en attente de modération
Et je vois le message "Votre replay sera publié après vérification suite aux signalements reçus"
Et un modérateur doit valider ou refuser le replay sous 24h
Scénario: Arrêt forcé par un modérateur
Étant donné que je diffuse un live
Et qu'un modérateur détecte du contenu interdit
Quand le modérateur clique sur "Arrêter le live immédiatement"
Alors le live s'arrête sans compte à rebours
Et je vois le message "Votre live a été interrompu par la modération"
Et je reçois une notification détaillant la raison
Et le replay n'est pas publié
Et le fichier source est conservé 30 jours pour appel
Scénario: Métriques de bande passante pendant le live
Étant donné que je diffuse un live
Et que 100 auditeurs écoutent simultanément
Alors la bande passante consommée est d'environ 4.8 Mbps via NGINX Cache
Et le coût estimé infrastructure est d'environ 0.02 par heure de diffusion
Et je peux voir ces métriques en temps réel dans l'interface créateur
Scénario: Live sans auditeurs pendant 5 minutes
Étant donné que je diffuse un live
Et qu'aucun auditeur n'écoute depuis 5 minutes
Alors je vois un message d'information "Aucun auditeur actuellement connecté"
Mais le live continue normalement
Et je peux choisir de continuer ou d'arrêter
Scénario: Qualité audio du replay supérieure au live
Étant donné que mon live était diffusé en Opus 48 kbps
Quand le replay est généré
Alors le replay est encodé en MP3 256 kbps
Et la qualité audio du replay est supérieure au live
Et la taille du fichier est optimisée pour le stockage long terme

View File

@@ -0,0 +1,275 @@
# language: fr
Fonctionnalité: Comportement auditeur pendant un live
En tant qu'auditeur
Je veux écouter un live avec une expérience stable et sécurisée
Afin de profiter du contenu en temps réel sans distraction
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté en tant qu'auditeur
Et qu'un créateur diffuse actuellement un live
Scénario: Buffer de synchronisation 15 secondes
Étant donné qu'un créateur parle en direct
Quand je rejoins le live
Alors j'entends l'audio avec un décalage de 15 secondes
Et ce buffer permet une stabilité optimale sur connexion 3G/4G
Et le buffer absorbe les fluctuations réseau courtes
Scénario: Justification buffer 15 secondes vs alternatives
Étant donné les différentes options de buffer possibles:
| Buffer | Stabilité 3G | Décalage perçu | Décision |
| 5s | Faible | Imperceptible | Rejeté |
| 10s | Moyenne | Faible | Rejeté |
| 15s | Excellente | Acceptable | Choisi |
| 20s+ | Très haute | Trop élevé | Rejeté |
Alors le buffer de 15 secondes est le meilleur compromis
Et la stabilité sur réseau mobile est prioritaire
Scénario: Continuation du live si sortie de zone géographique
Étant donné que j'écoute un live régional "Île-de-France"
Et que je suis situé à Paris
Quand je me déplace et sors de l'Île-de-France
Alors le live continue de jouer normalement
Et aucune coupure brutale ne se produit
Et l'écoute se termine naturellement
Scénario: Justification continuation hors zone
Étant donné que j'écoute activement un live
Quand je sors de la zone géographique ciblée
Alors le système ne coupe pas le live
Car une coupure brutale dégraderait l'expérience utilisateur
Et l'écoute engagée doit pouvoir se terminer naturellement
Mais après la fin du live, l'algorithme reprend le fonctionnement normal
Scénario: Après fin du live, algorithme normal reprend
Étant donné que j'ai écouté un live hors zone jusqu'à sa fin
Quand le live se termine
Alors l'algorithme de recommandation reprend son fonctionnement normal
Et je ne reçois plus de contenus hors de ma zone géographique actuelle
Scénario: Reconnexion rapide après coupure réseau (<90s)
Étant donné que j'écoute un live
Et que je perds ma connexion réseau pendant 30 secondes
Quand ma connexion revient
Alors je me reconnecte automatiquement au live
Et je reprends l'écoute au moment actuel du live
Et je ne reprends pas au buffer ancien (saut temporel transparent)
Scénario: Reconnexion après coupure réseau de 89 secondes
Étant donné que j'écoute un live
Et que je perds ma connexion réseau pendant 89 secondes
Quand ma connexion revient
Alors je me reconnecte au live en cours
Et je reprends au moment actuel
Car le seuil de 90 secondes n'est pas atteint
Scénario: Coupure réseau longue (≥90s) - Passage contenu suivant
Étant donné que j'écoute un live
Et que je perds ma connexion réseau pendant 90 secondes ou plus
Quand ma connexion revient
Alors je vois le message "Live en cours perdu, passage au contenu suivant"
Et l'algorithme me propose un contenu normal (non-live)
Et je ne rejoins pas le live précédent
Scénario: Saut temporel transparent lors de reconnexion
Étant donné que j'écoute un live au timestamp 00:05:00
Et que je perds ma connexion pendant 45 secondes
Quand je me reconnecte
Alors je reprends l'écoute au timestamp actuel du live (environ 00:05:45)
Et le saut de 45 secondes est transparent
Et je ne réentends pas les 45 secondes manquées
Scénario: Like disponible pendant le live (véhicule arrêté)
Étant donné que j'écoute un live
Et que mon véhicule est à l'arrêt
Quand je clique sur le bouton cœur
Alors un like est enregistré
Et mes jauges d'intérêt augmentent de +2% selon les tags du live
Et le créateur voit son compteur de likes s'incrémenter en temps réel
Scénario: Like désactivé pendant le live (véhicule en mouvement)
Étant donné que j'écoute un live
Et que mon véhicule est en mouvement
Quand j'essaie d'accéder aux interactions
Alors le bouton cœur est désactivé
Et je vois le message "Interactions disponibles uniquement véhicule à l'arrêt"
Car la sécurité routière est prioritaire
Scénario: Abonnement au créateur pendant le live (véhicule arrêté)
Étant donné que j'écoute un live d'un créateur non suivi
Et que mon véhicule est à l'arrêt
Quand je clique sur "S'abonner"
Alors l'abonnement est enregistré
Et mes jauges d'intérêt augmentent de +5% selon les tags du créateur
Et je recevrai des notifications pour ses prochains lives
Scénario: Skip disponible pendant le live
Étant donné que j'écoute un live
Quand je clique sur le bouton "Skip" (suivant)
Alors je quitte le live immédiatement
Et l'algorithme me propose le contenu suivant
Et je ne peux pas revenir au live via "Précédent"
Scénario: Bouton "Précédent" désactivé pendant un live
Étant donné que j'écoute un live
Quand je regarde les contrôles de lecture
Alors le bouton "Précédent" est désactivé (grisé)
Car il n'y a pas de sens sur un flux temps réel
Et je ne peux pas revenir en arrière dans un live
Scénario: Chat en direct jamais disponible (décision définitive)
Étant donné que j'écoute un live
Quand je cherche une fonctionnalité de chat
Alors aucun bouton de chat n'est disponible
Et aucune interface de messagerie n'est présente
Car cette fonctionnalité ne sera jamais implémentée
Scénario: Message explicatif sur absence de chat
Étant donné que j'essaie de chercher comment discuter pendant un live
Quand j'accède à l'aide ou aux FAQ
Alors je vois le message:
"""
💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement.
RoadWave privilégie l'écoute passive pour:
- Votre sécurité au volant (pas de distraction)
- Votre bien-être (pas de harcèlement, toxicité)
- Une expérience audio apaisante
"""
Scénario: Réactions emoji jamais disponibles (décision définitive)
Étant donné que j'écoute un live
Quand je cherche des réactions emoji ou boutons interactifs
Alors aucune réaction emoji n'est disponible
Car cette fonctionnalité ne sera jamais implémentée
Et seuls les likes explicites sont autorisés (véhicule arrêté)
Scénario: Justification absence chat et réactions
Étant donné les raisons de l'absence de chat:
| Raison | Justification |
| Sécurité routière | Pas de distraction en voiture (focus UX) |
| Harcèlement | Évite contenu haineux, insultes, trolling |
| Modération | Pas de coût modération temps réel (impossible à scale) |
| Simplicité | Écoute passive = expérience uniforme |
| Bien-être | Évite toxicité, harcèlement (fléau réseaux sociaux) |
| Juridique | Pas de risque contentieux modération chat (DSA EU) |
| Différenciation | Positionnement "audio safe" vs plateformes toxiques |
Alors cette décision est définitive et non négociable
Et RoadWave se positionne comme une plateforme d'écoute passive sécurisée
Scénario: Compteur d'auditeurs en temps réel visible
Étant donné que j'écoute un live
Quand je regarde l'interface
Alors je vois le nombre d'auditeurs simultanés "247 auditeurs en direct"
Et ce compteur se met à jour toutes les 10 secondes
Et cela donne une indication de la popularité du live
Scénario: Indicateur "En direct" clair
Étant donné que j'écoute un live
Alors je vois clairement un badge rouge "🔴 EN DIRECT"
Et je comprends immédiatement que c'est un flux temps réel
Et pas un contenu enregistré
Scénario: Pas de barre de progression sur live
Étant donné que j'écoute un live
Quand je regarde les contrôles de lecture
Alors il n'y a pas de barre de progression
Car on ne peut pas se déplacer dans un flux temps réel
Et seule la durée écoulée est affichée (ex: "23:45 écoulées")
Scénario: Transition fluide live vers contenu suivant
Étant donné que j'écoute un live
Quand le live se termine naturellement
Alors le délai de transition habituel de 2 secondes démarre
Et le contenu suivant est annoncé normalement
Et l'expérience est cohérente avec les contenus classiques
Scénario: Notification de fin de live
Étant donné que j'écoute un live
Quand le créateur arrête le live
Alors j'entends "Ce live se termine dans 5... 4... 3... 2... 1"
Et je vois le message "Live terminé"
Et je suis notifié que le replay sera disponible sous peu
Scénario: Qualité audio adaptative selon connexion
Étant donné que j'écoute un live en 4G
Et que ma connexion se dégrade vers 3G
Quand la bande passante diminue
Alors le player HLS natif adapte automatiquement la qualité
Et le buffer de 15 secondes absorbe les fluctuations
Et l'écoute reste fluide sans coupure
Scénario: Consommation data pendant écoute live
Étant donné que j'écoute un live en Opus 48 kbps
Quand j'écoute pendant 1 heure
Alors je consomme environ 21.6 MB de data
Et cette information peut être affichée dans les paramètres
Et l'utilisateur peut être averti si réseau cellulaire
Scénario: Tunnel ou coupure réseau courte (<15s)
Étant donné que j'écoute un live
Et que je passe dans un tunnel pendant 10 secondes
Quand je ressors du tunnel
Alors le buffer de 15 secondes a absorbé la coupure
Et l'écoute reprend sans interruption perceptible
Et je n'ai même pas remarqué la coupure
Scénario: Notifications désactivables pour les lives
Étant donné que je suis abonné à un créateur
Et que je reçois des notifications de ses lives
Quand j'accède aux paramètres de notification
Alors je peux désactiver spécifiquement les notifications "Live en direct"
Et je continue à recevoir les autres notifications
Et cela me permet de contrôler les interruptions
Scénario: Statistiques d'écoute personnelles après un live
Étant donné que j'ai écouté un live pendant 45 minutes
Quand je consulte mon historique d'écoute
Alors je vois l'entrée "[DIRECT] [Titre du live]"
Et la durée d'écoute "45 min"
Et la date/heure de diffusion
Et un lien vers le replay si disponible
Plan du Scénario: Reconnexion selon durée de coupure
Étant donné que j'écoute un live
Et que je perds ma connexion pendant <duree_coupure> secondes
Quand ma connexion revient
Alors le comportement est <comportement>
Exemples:
| duree_coupure | comportement |
| 10 | Reconnexion au live en cours |
| 30 | Reconnexion au live en cours |
| 60 | Reconnexion au live en cours |
| 89 | Reconnexion au live en cours |
| 90 | Passage au contenu suivant |
| 120 | Passage au contenu suivant |
Plan du Scénario: Actions disponibles selon état véhicule
Étant donné que j'écoute un live
Et que mon véhicule est <etat_vehicule>
Quand j'essaie d'effectuer l'action <action>
Alors le résultat est <resultat>
Exemples:
| etat_vehicule | action | resultat |
| arrêté | Like | Autorisé |
| arrêté | Abonnement | Autorisé |
| arrêté | Skip | Autorisé |
| en mouvement | Like | Bloqué |
| en mouvement | Abonnement | Bloqué |
| en mouvement | Skip | Autorisé |
Plan du Scénario: Interactions jamais disponibles
Étant donné que j'écoute un live
Quand je cherche l'interaction <interaction>
Alors elle est <disponibilite>
Car <raison>
Exemples:
| interaction | disponibilite | raison |
| Chat en direct | Jamais disponible | Sécurité routière + modération impossible |
| Réactions emoji | Jamais disponible | Sécurité routière + distraction |
| Précédent | Jamais disponible | Pas de sens sur flux temps réel |
| Seek (avancer) | Jamais disponible | Pas de sens sur flux temps réel |

View File

@@ -0,0 +1,209 @@
# language: fr
Fonctionnalité: Comportement auditeur pendant un live
En tant qu'auditeur
Je veux écouter des lives de manière stable
Afin de profiter du contenu en temps réel sans coupures
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté en tant qu'auditeur
Et qu'un créateur diffuse actuellement un live
Scénario: Rejoindre un live avec buffer de synchronisation 15 secondes
Quand je clique sur "Rejoindre le live"
Alors la connexion au flux HLS s'établit
Et je commence à écouter avec un décalage de 15 secondes par rapport au créateur
Et le buffer de 15 secondes garantit une lecture stable
Scénario: Justification du buffer 15 secondes
Étant donné les alternatives de buffer possibles:
| buffer | stabilité 3G | stabilité 4G | décalage perceptible | décision |
| 5s | Faible | Moyenne | Non | |
| 10s | Moyenne | Bonne | Non | |
| 15s | Bonne | Excellente | Léger acceptable | |
| 20s+ | Excellente | Excellente | Oui | |
Alors le buffer optimal est 15 secondes
Scénario: Lecture stable sur réseau 3G
Étant donné que je suis sur réseau 3G
Et que j'écoute un live
Quand des micro-coupures réseau surviennent
Alors le buffer de 15 secondes absorbe les coupures
Et la lecture continue sans interruption perceptible
Scénario: Lecture stable sur réseau 4G
Étant donné que je suis sur réseau 4G
Et que j'écoute un live
Alors la lecture est fluide
Et le buffer de 15 secondes prévient les coupures lors de changement de cellule
Scénario: Continuation du live en sortant de la zone géographique
Étant donné que j'écoute un live régional "Île-de-France"
Et que je suis situé en Île-de-France
Quand je me déplace et sors du département
Alors le live continue de jouer normalement
Et je peux écouter jusqu'à la fin naturelle du live
Et après la fin du live, l'algorithme propose du contenu correspondant à ma nouvelle position
Scénario: Abonné dans la zone reçoit notification push
Étant donné que je suis abonné au créateur "JeanDupont"
Et que je suis situé en Île-de-France
Quand "JeanDupont" démarre un live en Île-de-France
Alors je reçois une notification push "🔴 JeanDupont est en direct : [Titre du live]"
Et quand je tape sur la notification, l'app s'ouvre et le live démarre immédiatement
Scénario: Abonné hors zone ne reçoit pas de notification
Étant donné que je suis abonné au créateur "JeanDupont"
Et que je suis situé à Lyon
Quand "JeanDupont" démarre un live en Île-de-France
Alors je ne reçois pas de notification push
Et cela évite la frustration de ne pas pouvoir écouter un live hors zone
Scénario: Découverte d'un live via l'algorithme de recommandation
Étant donné que je suis dans la zone géographique du live
Et que je navigue dans l'app avec "Suivant"
Quand l'algorithme propose un live en cours
Alors je vois l'indicateur "🔴 EN DIRECT"
Et je peux choisir de le rejoindre ou de passer au suivant
Scénario: Reconnexion rapide après coupure réseau (moins de 90 secondes)
Étant donné que j'écoute un live
Quand je perds ma connexion réseau pendant 45 secondes
Et que je retrouve ma connexion
Alors je reprends le live au moment actuel (pas au buffer ancien)
Et le saut temporel est transparent (pas de message d'erreur)
Et je ne rate que quelques secondes de contenu
Scénario: Reconnexion longue après coupure réseau (90 secondes ou plus)
Étant donné que j'écoute un live
Quand je perds ma connexion réseau pendant 90 secondes
Et que je retrouve ma connexion
Alors je vois le message "Live en cours perdu, passage au contenu suivant"
Et l'algorithme propose automatiquement le contenu suivant
Et je peux manuellement revenir au live s'il est toujours en cours
Scénario: Interactions disponibles pendant le live - Like
Étant donné que j'écoute un live
Et que mon véhicule est à l'arrêt
Quand je clique sur le bouton " Like"
Alors le like est enregistré immédiatement
Et le compteur de likes visible par le créateur s'incrémente
Et ma jauge d'intérêt pour les tags du live augmente de +2%
Scénario: Interactions disponibles pendant le live - Abonnement
Étant donné que j'écoute un live
Et que je ne suis pas encore abonné au créateur
Quand je clique sur le bouton "S'abonner"
Alors je m'abonne au créateur
Et ma jauge d'intérêt pour tous les tags du créateur augmente de +5%
Et je recevrai des notifications pour ses prochains lives
Scénario: Interactions disponibles pendant le live - Skip
Étant donné que j'écoute un live
Quand j'appuie sur "Suivant" (ou commande au volant)
Alors je quitte le live immédiatement
Et l'algorithme propose le contenu suivant
Et si j'ai écouté moins de 10 secondes, ma jauge d'intérêt diminue de -0.5%
Scénario: Commande Précédent désactivée pendant un live
Étant donné que j'écoute un live
Quand j'appuie sur "Précédent" (ou commande au volant)
Alors rien ne se passe
Et un message d'information s'affiche brièvement "Précédent non disponible sur les lives"
Scénario: Chat en direct désactivé (décision définitive)
Étant donné que j'écoute un live
Alors aucune interface de chat n'est disponible
Et je ne peux pas envoyer de messages au créateur
Et je ne peux pas voir de messages d'autres auditeurs
Et cette fonctionnalité ne sera jamais implémentée
Scénario: Réactions emoji désactivées (décision définitive)
Étant donné que j'écoute un live
Alors aucune réaction emoji n'est disponible
Et je ne peux pas envoyer d'emoji en temps réel
Et cette fonctionnalité ne sera jamais implémentée
Scénario: Message d'information sur l'absence de chat
Étant donné que j'écoute mon premier live
Quand j'accède à l'interface du live
Alors je vois un bandeau informatif "💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement."
Et ce bandeau n'apparaît qu'une seule fois (première expérience)
Scénario: Signalement d'un live en cours
Étant donné que j'écoute un live
Et que le contenu me semble inapproprié
Quand je clique sur le bouton "Signaler"
Alors je vois les catégories de signalement:
| catégorie |
| Haine et violence |
| Contenu sexuel |
| Illégalité |
| Droits d'auteur |
| Désinformation dangereuse |
| Harcèlement |
| Autre |
Et quand je sélectionne une catégorie
Alors le signalement est envoyé en priorité selon la catégorie
Et un modérateur peut écouter le live en temps réel si besoin
Scénario: Statistiques visibles par les auditeurs pendant le live
Étant donné que j'écoute un live
Quand je consulte les informations du live
Alors je vois:
| information | exemple valeur |
| Nombre d'auditeurs | 247 personnes |
| Durée du live | 1h 23min |
| Nom du créateur | @JeanDupont |
| Zone de diffusion | Île-de-France |
| Tags | Actualité, Société |
Mais je ne vois pas les likes ou autres métriques détaillées
Scénario: Compteur d'auditeurs arrondi pour préserver la vie privée
Étant donné que j'écoute un live avec exactement 247 auditeurs
Quand je consulte le nombre d'auditeurs
Alors je vois "~250 auditeurs" (arrondi à la dizaine supérieure)
Scénario: Qualité audio adaptative pendant le live
Étant donné que j'écoute un live
Quand ma connexion passe de 4G à 3G
Alors la qualité audio s'adapte automatiquement
Et je passe de 48 kbps à 24 kbps Opus
Et la transition est transparente sans coupure
Scénario: Consommation de données pendant un live
Étant donné que j'écoute un live en qualité standard 48 kbps
Et que j'écoute pendant 1 heure
Alors j'ai consommé environ 21.6 MB de données mobiles
Et cette consommation est affichée dans les paramètres de l'app
Scénario: Lecture du replay après la fin du live
Étant donné que j'écoute un live depuis 30 minutes
Quand le créateur arrête le live
Alors je vois le message "Le live est terminé. Le replay sera disponible dans quelques minutes"
Et le contenu suivant est automatiquement proposé après 2 secondes
Scénario: Notification de disponibilité du replay
Étant donné que j'ai écouté un live jusqu'à la fin
Et que le replay est publié 8 minutes plus tard
Quand je rouvre l'application
Alors je vois une notification in-app "Le replay de [Titre] est maintenant disponible"
Et je peux cliquer pour l'écouter immédiatement
Scénario: Aucune publicité pendant un live pour utilisateurs gratuits
Étant donné que je suis un utilisateur gratuit
Et que j'écoute un live
Alors aucune publicité n'est insérée pendant le live
Et la publicité apparaît seulement entre le live et le contenu suivant
Scénario: Détection de contexte voiture pendant un live
Étant donné que j'écoute un live
Et que ma vitesse est supérieure à 10 km/h
Alors l'interface tactile est désactivée pour la sécurité
Et seules les commandes au volant sont actives (Play/Pause/Suivant)
Scénario: Détection de contexte piéton pendant un live
Étant donné que j'écoute un live
Et que ma vitesse est inférieure à 5 km/h
Alors l'interface tactile complète est disponible
Et je peux liker, m'abonner, signaler via l'écran tactile

View File

@@ -0,0 +1,162 @@
# language: fr
Fonctionnalité: Démarrage d'un live
En tant que créateur
Je veux démarrer une diffusion en direct
Afin de partager du contenu audio en temps réel avec mes auditeurs
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté en tant que créateur vérifié
Et que j'ai les permissions de diffusion live
Scénario: Vérifications pré-live réussies
Étant donné que ma connexion upload est supérieure à 1 Mbps
Et que j'ai autorisé l'accès au microphone
Et que j'ai défini une zone de diffusion "Île-de-France"
Quand je lance les vérifications pré-live
Alors toutes les vérifications sont validées
Et je peux démarrer le live
Scénario: Échec pré-live avec connexion insuffisante
Étant donné que ma connexion upload est de 0.5 Mbps
Quand je lance les vérifications pré-live
Alors je vois un warning "Connexion insuffisante pour garantir une diffusion stable (minimum 1 Mbps)"
Et je peux choisir de continuer quand même ou d'annuler
Scénario: Échec pré-live sans autorisation microphone
Étant donné que je n'ai pas autorisé l'accès au microphone
Quand j'essaie de démarrer un live
Alors je vois le message "Accès au microphone requis pour démarrer un live"
Et je suis redirigé vers les paramètres système
Scénario: Échec pré-live sans zone de diffusion définie
Étant donné que je n'ai pas défini de zone de diffusion
Quand j'essaie de démarrer un live
Alors je vois le message "Veuillez définir une zone de diffusion avant de démarrer"
Et je suis redirigé vers le formulaire de configuration du live
Scénario: Démarrage live avec buffer 15 secondes
Étant donné que toutes les vérifications pré-live sont validées
Quand j'appuie sur "Démarrer live"
Alors je vois le message "Live démarre dans 15s... Testez votre micro"
Et un compte à rebours de 15 secondes s'affiche
Et mon flux audio est enregistré pendant ces 15 secondes
Et le live n'est pas encore visible publiquement
Scénario: Live devient public après buffer initial
Étant donné que j'ai démarré un live
Et que le buffer de 15 secondes s'est écoulé
Alors le live devient public
Et les auditeurs peuvent le rejoindre
Et les abonnés dans la zone reçoivent une notification push
Scénario: Notification push aux abonnés dans la zone géographique
Étant donné que j'ai 1000 abonnés au total
Et que 300 abonnés sont situés en Île-de-France
Et que 700 abonnés sont situés hors Île-de-France
Quand mon live en Île-de-France devient public
Alors 300 abonnés reçoivent une notification push "🔴 [Mon pseudo] est en direct : [Titre live]"
Et 700 abonnés ne reçoivent pas de notification
Scénario: Configuration métadonnées obligatoires pour un live
Quand je configure un nouveau live
Alors je dois renseigner:
| champ | format | validation |
| Titre | 5-100 caractères | Obligatoire |
| Tags | 1-3 centres intérêt| Sélection liste prédéfinie |
| Classification âge | Enum | Tout public / 13+ / 16+ / 18+ |
| Zone diffusion | Geo | Ville / Département / Région / National |
Scénario: Validation échouée avec titre trop court
Quand j'essaie de créer un live avec le titre "Live"
Alors la validation échoue
Et je vois le message "Le titre doit contenir entre 5 et 100 caractères"
Scénario: Validation échouée sans tags
Étant donné que j'ai rempli tous les champs sauf les tags
Quand j'essaie de démarrer le live
Alors la validation échoue
Et je vois le message "Veuillez sélectionner entre 1 et 3 centres d'intérêt"
Scénario: Limite de durée 8 heures
Étant donné que mon live dure depuis 7 heures et 30 minutes
Alors je vois un warning "Votre live se terminera dans 30 min"
Et le message est affiché de manière non intrusive
Scénario: Arrêt automatique à 8 heures
Étant donné que mon live dure depuis 8 heures
Alors le live s'arrête automatiquement
Et je vois le message "Durée maximale atteinte (8 heures). Vous pouvez redémarrer un nouveau live si nécessaire"
Et le processus de traitement post-live démarre
Scénario: Diffusion contenu interdit - Concert en direct
Étant donné que je diffuse un concert en direct depuis une salle
Et qu'un auditeur signale le contenu pour "Violation droits d'auteur"
Quand un modérateur écoute le live
Et qu'il confirme la violation
Alors le live est arrêté immédiatement
Et je reçois un Strike 2 (suspension 7 jours)
Et je vois le message "Votre live a été interrompu pour violation des droits d'auteur"
Et le replay n'est pas publié
Scénario: Diffusion contenu interdit - Événement sportif payant
Étant donné que je diffuse un match de football avec droits TV
Et que le contenu est détecté par l'IA audio fingerprint
Quand la détection est confirmée
Alors le live est arrêté immédiatement
Et je reçois un Strike 2 (suspension 7 jours)
Scénario: Diffusion contenu violent
Étant donné que je diffuse du contenu violent (agression physique)
Et que 5 auditeurs signalent le contenu
Quand un modérateur vérifie en temps réel
Et confirme la violence
Alors le live est coupé immédiatement
Et je reçois un Strike 3 immédiat (suspension 30 jours)
Et le replay n'est pas publié
Scénario: Diffusion contenu illégal
Étant donné que je diffuse du contenu illégal (apologie terrorisme, contenu pédopornographique)
Et que des auditeurs signalent le contenu
Quand un modérateur vérifie en temps réel
Et confirme le contenu illégal
Alors le live est coupé immédiatement
Et je reçois un Strike 4 (ban définitif)
Et mon compte est banni définitivement
Et les autorités compétentes sont immédiatement notifiées
Et le replay n'est pas publié
Scénario: Détection musique protégée en arrière-plan
Étant donné que mon live contient de la musique protégée en fond
Quand l'IA audio fingerprint détecte la violation après 2 minutes
Alors je reçois un avertissement en direct "Musique protégée détectée. Veuillez couper le son ou risquez un arrêt du live"
Et j'ai 30 secondes pour corriger
Et si je ne corrige pas, le live est arrêté avec Strike 1
Scénario: Signalement pendant un live
Étant donné que je diffuse un live
Et qu'un auditeur clique sur "Signaler"
Quand l'auditeur sélectionne la catégorie "Harcèlement"
Alors le signalement est envoyé en priorité HAUTE
Et un modérateur peut écouter le live en temps réel
Et le live continue pendant l'écoute de vérification
Scénario: Dépassement nombre de lives simultanés autorisés (limite plateforme)
Étant donné que la plateforme héberge actuellement 2000 lives simultanés
Et que c'est la limite de l'infrastructure actuelle
Quand j'essaie de démarrer un nouveau live
Alors je vois le message "Capacité maximale atteinte. Veuillez réessayer dans quelques minutes"
Et ma demande est mise en file d'attente prioritaire si je suis créateur Premium
Scénario: Premier live d'un nouveau créateur
Étant donné que je n'ai jamais diffusé de live auparavant
Et que j'ai moins de 3 contenus validés
Quand j'essaie de démarrer mon premier live
Alors je vois le message "Les lives sont disponibles après validation de vos 3 premiers contenus"
Et le bouton "Démarrer live" est désactivé
Scénario: Créateur avec score de confiance faible
Étant donné que j'ai 2 strikes actifs
Quand j'essaie de démarrer un live
Alors je vois le message "Fonctionnalité live temporairement indisponible suite à vos sanctions"
Et je dois attendre la fin de ma suspension

View File

@@ -0,0 +1,63 @@
# language: fr
@api @radio-live @replay @mvp
Fonctionnalité: Enregistrement et publication de replays radio live
En tant que créateur radio
Je veux enregistrer mes lives et les publier en replay
Afin d'étendre la durée de vie de mon contenu
Scénario: Enregistrement automatique du live
Étant donné un créateur "alice@roadwave.fr" qui lance un live
Quand le live démarre
Alors l'enregistrement démarre automatiquement
Et est stocké sur S3 en temps réel (streaming)
Et un événement "LIVE_RECORDING_STARTED" est enregistré
Scénario: Publication automatique du replay après le live
Étant donné un créateur "bob@roadwave.fr" qui termine son live
Quand le live se termine
Alors le replay est disponible immédiatement
Et apparaît dans "Replays récents"
Et conserve les métadonnées du live (titre, description)
Et un événement "REPLAY_AUTO_PUBLISHED" est enregistré
Scénario: Édition du replay avant publication
Étant donné un créateur "charlie@roadwave.fr" avec un replay enregistré
Quand il accède au replay
Alors il peut:
| Action | Disponible |
| Couper le début/fin | Oui |
| Supprimer des passages | Oui |
| Ajouter des chapitres | Oui |
| Modifier le titre | Oui |
Et republier après édition
Et un événement "REPLAY_EDITED" est enregistré
Scénario: Conversion automatique en podcast
Étant donné un créateur "david@roadwave.fr" avec replay
Quand il active "Convertir en podcast"
Alors le replay devient un podcast téléchargeable
Et est ajouté au flux RSS du créateur
Et compatible avec Apple Podcasts / Spotify
Et un événement "REPLAY_CONVERTED_TO_PODCAST" est enregistré
Scénario: Durée de rétention des replays configurab le
Étant donné un créateur "eve@roadwave.fr"
Quand il configure la rétention des replays
Alors il peut choisir:
| Durée | Coût stockage |
| 7 jours | Gratuit |
| 30 jours | 1/mois |
| 1 an | 5/mois |
| Permanent | 10/mois |
Et un événement "REPLAY_RETENTION_CONFIGURED" est enregistré
Scénario: Statistiques des replays vs live
Étant donné un créateur "frank@roadwave.fr"
Alors il voit les comparaisons:
| Métrique | Live | Replay |
| Auditeurs uniques | 234 | 567 |
| Durée moyenne écoute | 42min | 28min |
| Taux de complétion | 65% | 48% |
Et un événement "REPLAY_STATS_COMPARED" est enregistré

View File

@@ -0,0 +1,52 @@
# language: fr
@api @radio-live @moderation @mvp
Fonctionnalité: Interdictions et modération des lives
En tant que plateforme
Je veux modérer les lives en temps réel
Afin de prévenir les contenus inappropriés
Scénario: Détection automatique de mots interdits
Étant donné un live en cours avec transcription automatique
Quand un mot interdit est détecté
Alors une alerte est envoyée aux modérateurs
Et le segment est marqué pour review
Et un événement "LIVE_FORBIDDEN_WORD_DETECTED" est enregistré
Scénario: Coupure immédiate du live par modérateur
Étant donné un modérateur qui détecte du contenu inapproprié
Quand il clique sur "Couper le live"
Alors le live est stoppé immédiatement
Et les auditeurs voient "Live interrompu par modération"
Et le créateur reçoit une notification avec raison
Et un événement "LIVE_CUT_BY_MODERATOR" est enregistré
Scénario: Suspension temporaire du droit de faire des lives
Étant donné un créateur "alice@roadwave.fr" qui enfreint les règles
Quand un modérateur applique une sanction
Alors le créateur ne peut plus lancer de live pendant X jours
Et ses replays restent accessibles (si conformes)
Et un événement "LIVE_SUSPENSION_APPLIED" est enregistré
Scénario: Signalement en temps réel par les auditeurs
Étant donné un auditeur qui détecte du contenu problématique
Quand il clique sur "Signaler"
Alors le signalement est envoyé immédiatement aux modérateurs
Et inclut le timestamp exact du problème
Et un événement "LIVE_REPORTED_BY_USER" est enregistré
Scénario: Délai obligatoire de 7 secondes (broadcast delay)
Étant donné un live en cours
Alors un délai de 7 secondes est appliqué
Et permet de couper le flux si nécessaire
Et les auditeurs ne perçoivent pas le délai
Et un événement "LIVE_BROADCAST_DELAY_ACTIVE" est enregistré
Scénario: Historique des infractions du créateur
Étant donné un modérateur qui évalue un créateur
Alors il voit l'historique:
| Date | Infraction | Sanction |
| 2026-01-15 | Langage inapproprié | Avertissement |
| 2025-12-10 | Spam | Suspension 3j |
Et un événement "CREATOR_INFRACTION_HISTORY_VIEWED" est enregistré