feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024

Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture.

## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU)

- Créer structure features/{api,ui,e2e}
- Déplacer 83 features en 3 catégories via git mv (historique préservé)
  - features/api/ : 53 features (tests API backend)
  - features/ui/ : 22 features (tests UI mobile)
  - features/e2e/ : 8 features (tests end-to-end)

Domaines déplacés :
- API : authentication, recommendation, rgpd-compliance, content-creation,
  moderation, monetisation, premium, radio-live, publicites
- UI : audio-guides, navigation, interest-gauges, mode-offline,
  partage, profil, recherche
- E2E : abonnements, error-handling

## Phase 2 : Mise à jour Documentation

### ADR-007 - Tests BDD
- Ajouter section "Convention de Catégorisation des Features"
- Documenter règles api/ui/e2e avec exemples concrets
- Spécifier step definitions (backend Go, mobile Dart)

### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU)
- Créer ADR dédié pour stratégie CI/CD avec path filters
- Architecture workflows séparés (backend.yml, mobile.yml, shared.yml)
- Configuration path filters détaillée avec exemples YAML
- Matrice de déclenchement et optimisations (~70% gain temps CI)
- Plan d'implémentation (~2h, reporté jusqu'au développement)

### ADR-016 - Organisation Monorepo
- Simplifier en retirant section CI/CD détaillée
- Ajouter référence vers ADR-024 pour stratégie CI/CD

### INCONSISTENCIES-ANALYSIS.md
- Point #10 (Tests BDD synchronisés) :  RÉSOLU
  - Catégorisation features implémentée
  - ADR-007 mis à jour avec convention complète
- Point #11 (70/30 Split paiements) :  ANNULÉ (faux problème)
  - ADR-009 et Règle 18 parfaitement cohérents
  - Documentation exhaustive existante (formule, SQL, comparaisons)
- Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ
  - Architecture CI/CD complète dans ADR-024
  - Implémentation reportée (projet en phase documentation)
- Métriques mises à jour :
  - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté)
  - ADR à jour : 100% (19/19 avec ADR-024)

## Phase 3 : Validation

- Structure features validée (api/ui/e2e, aucun répertoire restant)
- Historique Git préservé (git mv, renommages détectés)
- 83 features total (API: 53, UI: 22, E2E: 8)

Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,299 @@
# language: fr
Fonctionnalité: Métriques d'engagement et dashboard publicitaire
En tant que publicitaire
Je veux consulter des métriques détaillées en temps réel
Afin d'optimiser mes campagnes et mesurer leur ROI
Contexte:
Étant donné que l'API RoadWave est disponible
Et qu'un compte publicitaire est connecté
Et qu'une campagne active est en cours
Scénario: Dashboard temps réel avec métriques essentielles
Étant donné que ma campagne a généré 1000 diffusions
Quand je consulte le dashboard
Alors je vois les métriques suivantes mises à jour en temps réel:
| Métrique | Valeur |
| Impressions | 1000 |
| Écoutes complètes (>80%)| 400 |
| Taux d'écoute complète | 40% |
| Taux de skip | 60% |
| Durée moyenne d'écoute | 18s |
| Likes | 25 |
| Abonnements | 5 |
| Coût par écoute | 0.05 |
Scénario: Calcul impressions totales
Étant donné que ma publicité a été diffusée 2500 fois
Quand je consulte le dashboard
Alors le compteur "Impressions" affiche 2500
Et il s'incrémente en temps réel à chaque nouvelle diffusion
Scénario: Calcul écoutes complètes (>80%)
Étant donné que ma publicité de 30s a été:
| Durée écoutée | Nombre |
| 25s (83%) | 300 |
| 20s (67%) | 200 |
| 10s (33%) | 150 |
| 5s (17%) | 50 |
Quand je consulte les écoutes complètes
Alors le compteur affiche 300 (uniquement 80%)
Et le taux d'écoute complète est de 43% (300/700)
Scénario: Calcul taux de skip
Étant donné 1000 diffusions totales
Et 400 écoutes complètes
Quand je consulte le taux de skip
Alors il affiche 60% ((1000-400)/1000)
Et il est calculé comme (total - complètes) / total
Scénario: Durée moyenne d'écoute calculée
Étant donné que ma publicité de 30s a été écoutée:
| Durée | Nombre d'utilisateurs |
| 30s | 400 |
| 20s | 300 |
| 10s | 200 |
| 5s | 100 |
Quand je consulte la durée moyenne
Alors le calcul est: (30×400 + 20×300 + 10×200 + 5×100) / 1000
Et le résultat affiché est 21s
Scénario: Métriques de likes sur publicité
Étant donné que 50 utilisateurs ont liké ma publicité
Quand je consulte le dashboard
Alors le compteur "Likes" affiche 50
Et un taux de like de 5% est calculé (50/1000 impressions)
Et cela indique une forte appréciation du contenu
Scénario: Métriques d'abonnements générés
Étant donné que 10 utilisateurs se sont abonnés après avoir entendu ma pub
Quand je consulte le dashboard
Alors le compteur "Abonnements" affiche 10
Et un taux de conversion de 1% est calculé (10/1000)
Et cela représente un engagement très fort
Scénario: Calcul coût par écoute (CPE)
Étant donné que j'ai dépensé 200
Et obtenu 4000 écoutes complètes
Quand je consulte le coût par écoute
Alors le CPE affiché est 0.05 (200/4000)
Et il correspond au tarif standard RoadWave
Scénario: Répartition géographique avec heatmap
Étant donné que ma campagne cible le département du Var
Et que j'ai 1000 diffusions réparties:
| Zone | Diffusions | Pourcentage |
| Toulon | 400 | 40% |
| Hyères | 250 | 25% |
| Fréjus | 200 | 20% |
| Autres | 150 | 15% |
Quand je consulte la heatmap géographique
Alors une carte Leaflet affiche les zones avec intensité proportionnelle
Et Toulon apparaît en rouge foncé (forte concentration)
Et les autres villes en dégradé orange/jaune
Scénario: Répartition horaire avec graphique
Étant donné que ma campagne cible les plages 7h-9h et 17h-19h
Et que j'ai 1000 diffusions:
| Plage horaire | Diffusions |
| 7h-8h | 300 |
| 8h-9h | 250 |
| 17h-18h | 280 |
| 18h-19h | 170 |
Quand je consulte le graphique horaire
Alors un histogramme Chart.js affiche les 4 barres
Et je peux identifier que 7h-8h est le pic d'écoute
Et optimiser mes futures campagnes sur cette plage
Scénario: Taux de complétion par tranche d'âge
Étant donné que ma campagne est Tout Public
Et que j'ai des écoutes sur différentes tranches:
| Tranche d'âge | Écoutes complètes | Total diffusions | Taux |
| 18-24 ans | 120 | 400 | 30% |
| 25-34 ans | 200 | 400 | 50% |
| 35-44 ans | 80 | 200 | 40% |
Quand je consulte l'analyse par âge
Alors je vois que les 25-34 ans ont le meilleur taux (50%)
Et je peux cibler cette tranche pour mes prochaines campagnes
Scénario: Comparatif de campagnes A/B testing
Étant donné que j'ai 2 campagnes actives:
| Campagne | Budget | Écoutes complètes | Taux | CPE |
| A | 300 | 4000 | 40% | 0.075|
| B | 300 | 6000 | 60% | 0.05 |
Quand je consulte le comparatif
Alors je vois que la campagne B performe mieux
Et le tableau recommande "Campagne B: +50% écoutes, -33% CPE"
Et je peux allouer plus de budget à la campagne B
Scénario: Export données CSV pour analyse externe
Étant donné que je veux analyser mes données dans Excel
Quand je clique sur "Exporter CSV"
Alors je télécharge un fichier avec les colonnes:
| Colonne |
| Date |
| Heure |
| Zone géographique |
| Tranche d'âge |
| Durée écoute |
| Skip (Oui/Non) |
| Like (Oui/Non) |
| Abonnement (Oui/Non) |
Et je peux faire des analyses personnalisées
Scénario: Export graphiques interactifs
Étant donné que je consulte le dashboard
Quand je clique sur un graphique Chart.js
Alors je peux zoomer/filtrer interactivement
Et je peux exporter le graphique en PNG
Et l'image est en haute résolution pour présentations
Scénario: Rapport PDF automatique fin de campagne
Étant donné que ma campagne de 14 jours se termine
Quand la date de fin est atteinte
Alors un rapport PDF est généré automatiquement
Et il contient:
| Section |
| Résumé exécutif |
| Métriques clés |
| Graphiques de performance |
| Heatmap géographique |
| Répartition horaire |
| Analyse tranches d'âge |
| Recommandations optimisation |
Et je reçois un email avec le PDF en pièce jointe
Scénario: Métriques temps réel rafraîchies automatiquement
Étant donné que je consulte le dashboard à 10h00
Quand une nouvelle diffusion se produit à 10h01
Alors les métriques sont rafraîchies automatiquement (polling 30s)
Et je vois les nouveaux chiffres sans recharger la page
Et un badge "Mis à jour il y a 15s" s'affiche
Scénario: Alertes performance personnalisées
Étant donné que je configure une alerte "Taux de skip >70%"
Et que ma campagne atteint 72% de skip
Quand le seuil est dépassé
Alors je reçois un email d'alerte:
"""
Alerte Performance - Taux de skip élevé
Votre campagne a un taux de skip de 72%.
Recommandations:
- Réduire la durée de la publicité
- Améliorer l'accroche des 5 premières secondes
- Vérifier le ciblage (audience pertinente?)
"""
Scénario: Benchmark vs moyennes RoadWave
Étant donné que ma campagne a 45% d'écoutes complètes
Quand je consulte le benchmark
Alors je vois "Votre taux: 45% | Moyenne RoadWave: 40%"
Et un badge "📊 Performance: +12% vs moyenne" s'affiche
Et je sais que ma campagne performe au-dessus de la moyenne
Scénario: Coût total consommé vs budget
Étant donné que j'ai un budget de 300
Et que j'ai consommé 220
Quand je consulte le dashboard
Alors je vois une jauge "Budget consommé: 73%" (220/300)
Et le montant restant "80 restants"
Et une projection "Épuisé dans 3 jours à ce rythme"
Scénario: Répartition coûts par type d'écoute
Étant donné que j'ai dépensé 200 avec:
| Type d'écoute | Nombre | Coût unitaire | Total |
| Écoute complète | 3000 | 0.05 | 150 |
| Skip après 5s | 2000 | 0.02 | 40 |
| Skip immédiat | 500 | 0 | 0 |
Quand je consulte la répartition
Alors un graphique camembert affiche:
| Segment | Pourcentage |
| Écoutes complètes | 75% (150) |
| Skips partiels | 20% (40) |
| Skips immédiats | 5% (0) |
Scénario: Évolution performance dans le temps
Étant donné une campagne de 30 jours
Quand je consulte le graphique d'évolution
Alors je vois une courbe Chart.js avec:
| Axe | Donnée |
| X | Jours (1-30) |
| Y | Taux d'écoute complète (%) |
Et je peux identifier les tendances (amélioration/dégradation)
Et les jours avec pics d'engagement
Scénario: Métriques avancées - Taux de réécoute
Étant donné qu'un utilisateur a entendu ma pub 3 fois
Et qu'il l'a écoutée complètement les 3 fois
Quand je consulte les métriques avancées
Alors le "Taux de réécoute" affiche 100%
Et cela indique que le contenu n'est pas perçu comme spam
Et les utilisateurs tolèrent bien la répétition
Scénario: Recommandations automatiques d'optimisation
Étant donné que ma campagne a un taux de skip de 75%
Et que la durée moyenne d'écoute est de 8s sur 30s
Quand je consulte les recommandations
Alors le système suggère:
"""
🔍 Analyse de votre campagne
Problème identifié: Perte d'attention après 8 secondes
Recommandations:
1. Placer votre message clé dans les 5 premières secondes
2. Réduire la durée totale à 15-20 secondes
3. Ajouter un appel à l'action plus tôt
4. Tester un nouveau créatif avec accroche différente
"""
Scénario: Suivi multi-campagnes avec vue consolidée
Étant donné que j'ai 3 campagnes actives simultanément
Quand je consulte la vue consolidée
Alors je vois un tableau récapitulatif:
| Campagne | Budget | Dépensé | Diffusions | Taux complète | CPE |
| A | 300 | 220 | 4000 | 40% | 0.05 |
| B | 500 | 150 | 3000 | 60% | 0.05 |
| C | 200 | 180 | 3600 | 35% | 0.05 |
Et je peux comparer les performances d'un coup d'œil
Plan du Scénario: Calcul taux d'écoute complète
Étant donné <total> diffusions totales
Et <completes> écoutes complètes (80%)
Quand je calcule le taux
Alors le résultat est <taux>%
Exemples:
| total | completes | taux |
| 1000 | 400 | 40 |
| 2000 | 1200 | 60 |
| 500 | 100 | 20 |
| 1000 | 850 | 85 |
Plan du Scénario: Calcul coût par écoute (CPE)
Étant donné un budget dépensé de <depense>
Et <ecoutes> écoutes complètes
Quand je calcule le CPE
Alors le résultat est <cpe>
Exemples:
| depense | ecoutes | cpe |
| 100 | 2000 | 0.05 |
| 300 | 6000 | 0.05 |
| 50 | 1000 | 0.05 |
| 500 | 10000 | 0.05 |
Plan du Scénario: Classification performance vs benchmark
Étant donné un taux d'écoute complète de <taux>%
Et une moyenne RoadWave de 40%
Quand je compare à la moyenne
Alors la performance est <classification>
Exemples:
| taux | classification |
| 60 | Excellente (+50%) |
| 50 | Bonne (+25%) |
| 40 | Moyenne |
| 30 | Faible (-25%) |
| 20 | Très faible (-50%)|