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>
147 lines
7.2 KiB
Gherkin
147 lines
7.2 KiB
Gherkin
# language: fr
|
||
Fonctionnalité: Impact des abonnements sur l'algorithme
|
||
En tant qu'auditeur
|
||
Je veux que les contenus de mes créateurs suivis soient favorisés
|
||
Afin de ne pas rater leurs publications tout en découvrant de nouveaux contenus
|
||
|
||
Contexte:
|
||
Étant donné que l'API RoadWave est disponible
|
||
Et que je suis connecté en tant qu'auditeur
|
||
Et que je suis abonné au créateur "JeanDupont"
|
||
|
||
Scénario: Boost de +30% appliqué au score final
|
||
Étant donné un contenu du créateur "JeanDupont" avec:
|
||
| score_geo | 0.5 |
|
||
| score_interet | 0.6 |
|
||
| score_engage | 0.5 |
|
||
Quand le score final est calculé
|
||
Alors le score de base est 0.53
|
||
Et le boost abonnement de +30% est appliqué
|
||
Et le score final avec boost est 0.69
|
||
|
||
Scénario: Contenu non-suivi peut battre contenu suivi
|
||
Étant donné que je suis à Paris
|
||
Et que 2 contenus sont disponibles:
|
||
| contenu | createur_suivi | score_geo | score_interet | score_engage | score_final_base | score_avec_boost |
|
||
| Contenu A | Non | 0.9 | 0.8 | 0.7 | 0.80 | 0.80 |
|
||
| Contenu B | Oui | 0.5 | 0.6 | 0.5 | 0.53 | 0.69 |
|
||
Quand l'algorithme sélectionne le prochain contenu
|
||
Alors le Contenu A est proposé en premier
|
||
Car son score (0.80) est supérieur au Contenu B avec boost (0.69)
|
||
|
||
Scénario: Contenu suivi remporte grâce au boost
|
||
Étant donné que je suis à Paris
|
||
Et que 2 contenus sont disponibles:
|
||
| contenu | createur_suivi | score_final_base | score_avec_boost |
|
||
| Contenu A | Non | 0.70 | 0.70 |
|
||
| Contenu B | Oui | 0.60 | 0.78 |
|
||
Quand l'algorithme sélectionne le prochain contenu
|
||
Alors le Contenu B est proposé en premier
|
||
Car le boost fait pencher la balance (0.78 > 0.70)
|
||
|
||
Scénario: Contenu suivi avec faible engagement ne domine pas
|
||
Étant donné que je suis abonné au créateur "CreateurMoyen"
|
||
Et qu'il publie un contenu avec très faible engagement (score 0.30)
|
||
Et qu'un contenu viral d'un créateur non-suivi a un score de 0.85
|
||
Quand l'algorithme sélectionne le prochain contenu
|
||
Alors le contenu viral est proposé en premier (0.85)
|
||
Car même avec boost, le contenu suivi obtient seulement 0.39 (0.30 × 1.3)
|
||
|
||
Scénario: Pas de file dédiée aux abonnements
|
||
Étant donné que je suis abonné à 50 créateurs
|
||
Quand l'algorithme génère ma file d'attente de 5 contenus
|
||
Alors les contenus suivis et non-suivis sont mélangés
|
||
Et tous entrent en compétition selon leurs scores (avec boost si abonnement)
|
||
Et il n'y a pas de section séparée "Contenus de vos abonnements"
|
||
|
||
Scénario: Vérification du calcul du boost
|
||
Étant donné un contenu d'un créateur suivi
|
||
Et que le score final de base est calculé à 0.65
|
||
Quand le boost abonnement est appliqué
|
||
Alors le multiplicateur utilisé est exactement 1.3
|
||
Et le score final avec boost est 0.845 (0.65 × 1.3)
|
||
Et le résultat est arrondi à 2 décimales: 0.85
|
||
|
||
Scénario: Boost appliqué à tous les contenus du créateur suivi
|
||
Étant donné que je suis abonné au créateur "JeanDupont"
|
||
Et qu'il a publié 10 contenus différents
|
||
Quand l'algorithme évalue chacun de ces contenus
|
||
Alors le boost de +30% est appliqué à tous les 10 contenus
|
||
Et chaque contenu bénéficie du même multiplicateur 1.3
|
||
|
||
Scénario: Plusieurs créateurs suivis en compétition
|
||
Étant donné que je suis abonné à "Créateur A" et "Créateur B"
|
||
Et que les 2 ont des contenus disponibles dans ma zone:
|
||
| createur | score_base | score_avec_boost |
|
||
| Créateur A | 0.70 | 0.91 |
|
||
| Créateur B | 0.65 | 0.85 |
|
||
Quand l'algorithme sélectionne le prochain contenu
|
||
Alors le contenu du Créateur A est proposé en premier (0.91 > 0.85)
|
||
Et les 2 bénéficient du boost, mais le meilleur score gagne
|
||
|
||
Scénario: Contenu national d'un créateur suivi
|
||
Étant donné que je suis abonné à "MediaNational"
|
||
Et qu'il publie un contenu de type "National" (score_geo 0.2)
|
||
Quand le score est calculé avec:
|
||
| score_geo | score_interet | score_engage |
|
||
| 0.2 | 0.7 | 0.6 |
|
||
Alors le score de base est environ 0.50
|
||
Et avec le boost abonnement, le score devient 0.65
|
||
Et le contenu peut être proposé malgré son score géo faible
|
||
|
||
Scénario: Transparence du boost dans les paramètres
|
||
Quand j'accède aux paramètres de l'algorithme de recommandation
|
||
Alors je vois l'information: "Les contenus de vos créateurs suivis bénéficient d'un boost de +30%"
|
||
Et je comprends que ce n'est pas une priorité absolue
|
||
Et que la découverte de nouveaux contenus reste possible
|
||
|
||
Scénario: Boost désactivé si désabonnement
|
||
Étant donné que je suis abonné au créateur "JeanDupont"
|
||
Et qu'un de ses contenus bénéficiait du boost +30%
|
||
Quand je me désabonne de "JeanDupont"
|
||
Alors ses contenus n'ont plus le boost
|
||
Et leur score revient au score de base sans multiplicateur
|
||
|
||
Scénario: Contenu d'un créateur nouvellement suivi
|
||
Étant donné que je viens de m'abonner à "NouveauCreateur"
|
||
Et qu'il a publié un contenu il y a 2 jours
|
||
Quand l'algorithme recalcule les scores
|
||
Alors le boost de +30% est immédiatement appliqué à ce contenu
|
||
Et il peut apparaître dans ma prochaine file d'attente
|
||
|
||
Scénario: Impact sur le taux de contenu suivi dans le feed
|
||
Étant donné que je suis abonné à 30 créateurs
|
||
Et que j'écoute 100 contenus sur une semaine
|
||
Quand j'analyse la répartition
|
||
Alors environ 40-50% des contenus proviennent de créateurs suivis
|
||
Et 50-60% proviennent de créateurs non-suivis (découverte)
|
||
Car le boost favorise sans dominer
|
||
|
||
Scénario: Contenu suivi hors zone géographique
|
||
Étant donné que je suis à Paris
|
||
Et que je suis abonné à un créateur de Marseille
|
||
Et qu'il publie un contenu ancré à Marseille (hors de portée)
|
||
Quand l'algorithme évalue ce contenu
|
||
Alors le score géo est quasi nul (0.05)
|
||
Et même avec boost +30%, le score reste très faible
|
||
Et le contenu n'est probablement pas proposé
|
||
|
||
Scénario: Performance de calcul du boost
|
||
Étant donné que je suis abonné à 100 créateurs
|
||
Et que l'algorithme évalue 1000 contenus potentiels
|
||
Quand le calcul des scores avec boost est effectué
|
||
Alors le temps de calcul reste inférieur à 50ms
|
||
Car le boost est une simple multiplication (opération O(1))
|
||
Et la requête SQL utilise un JOIN sur la table abonnements
|
||
|
||
Scénario: Boost combiné avec d'autres facteurs
|
||
Étant donné un contenu d'un créateur suivi
|
||
Et que le contenu bénéficie aussi de:
|
||
| facteur | impact |
|
||
| Score d'engagement élevé | +20% |
|
||
| Contenu récent (<24h) | +10% |
|
||
| Boost abonnement | +30% |
|
||
Quand le score final est calculé
|
||
Alors le boost abonnement s'applique au score final (après tous les autres calculs)
|
||
Et les boosts ne s'additionnent pas, le boost abonnement est un multiplicateur final
|