test(gherkin): ajouter tests BDD pour toutes clarifications règles métier

Ajoute/modifie tests Gherkin pour couvrir les 7 sections clarifiées :

1. Algorithme recommandation (scoring intérêts nuls) :
   - Ajout scénarios scoring-recommandation.feature
   - Cas contenu géo-ancré proche avec intérêts nuls = recommandable
   - Comparaison scores géo vs intérêts

2. Audio-guides mode voiture (système double clic) :
   - Nouveau fichier systeme-double-clic-sortie.feature
   - Premier clic : passage mode manuel + séquence suivante
   - Deuxième clic <10s : sortie audio-guide
   - Détection hors itinéraire + reprise

3. Monétisation créateurs (soldes dormants + DAS2) :
   - Nouveau fichier soldes-dormants-inactifs.feature
   - Conservation indéfinie si actif
   - Emails 12/18 mois + versement forcé 18 mois + 30j
   - Exception soldes <10€ avec proposition don
   - Modification obligations-fiscales.feature
   - DAS2 systématique tous montants (même <1200€)

4. Skip et abonnement (neutralisation pénalités) :
   - Nouveau fichier skip-abonnes-neutralisation.feature
   - Skip <10s non-abonné : -0.5%
   - Skip <10s abonné : 0% (neutre)
   - Métriques engagement : abonnés ne pénalisent pas
   - Anti-raid naturel (sources non pertinentes)

5. Premium multi-devices (KISS) :
   - Nouveau fichier multi-devices-dernier-priorite.feature
   - Règle simple : dernier device prend toujours priorité
   - Offline connecté vs déconnecté
   - Détection abus post-MVP (pas automatique)

6. Mode offline (contenus supprimés) :
   - Nouveau fichier contenus-supprimes-pendant-offline.feature
   - Suppression immédiate à reconnexion
   - Modal si contenu en cours d'écoute
   - Popup récapitulative si 2+ contenus supprimés

7. Publicités (ciblage horaire + fuseaux horaires) :
   - Nouveau fichier ciblage-horaire-fuseaux-horaires.feature
   - Ciblage horaire = heure locale utilisateur
   - France entière = Métropole + DOM
   - Détection fuseau GPS/device/IP
   - Cas d'usage restaurant Guadeloupe, assureur national

Couverture complète de toutes les règles métier clarifiées.
This commit is contained in:
jpgiannetti
2026-02-07 11:14:17 +01:00
parent e82ed63904
commit f6a5b9afce
8 changed files with 1501 additions and 0 deletions

View File

@@ -178,3 +178,44 @@ Fonctionnalité: Formule de scoring et recommandation
Quand l'utilisateur demande le contenu suivant
Alors l'algorithme recalcule les scores
Et prend en compte les nouveaux contenus publiés
# Règle: Score géo excellent + intérêts nuls = recommandation possible (MVP)
Scénario: Contenu géo-ancré proche avec intérêts nuls reste recommandable
Étant donné qu'un contenu géo-ancré "Info trafic local" est à 100m de l'utilisateur
Et que le contenu est tagué "Actualités" et "Trafic"
Et que l'utilisateur a des jauges à 0% pour ces tags (aucun intérêt marqué)
Et que le score_geo = 1.0 (distance 100m, excellent)
Et que le score_interets = 0.0 (jauges nulles)
Et que le score_engagement = 0.6 (contenu récent, peu d'historique)
Quand l'algorithme calcule le score_final pour un contenu géo-ancré
Alors score_final = (1.0 × 0.7) + (0.0 × 0.1) + (0.6 × 0.2)
Et score_final = 0.7 + 0.0 + 0.12 = 0.82
Et le contenu peut être recommandé malgré l'intérêt nul
Et ce comportement est accepté pour MVP car:
| justification |
| Le quota 6 contenus géolocalisés/h protège du spam |
| L'info peut être utile contextuellement |
| La distinction info/divertissement est reportée post-MVP|
Scénario: Contenu géo-neutre loin avec intérêts élevés recommandé
Étant donné qu'un contenu géo-neutre "Podcast philosophie" est à 150 km
Et que le contenu est tagué "Philosophie" et "Culture"
Et que l'utilisateur a des jauges à 90% pour ces tags
Et que le score_geo = 0.25 (150 km de distance)
Et que le score_interets = 0.9 (jauges élevées)
Et que le score_engagement = 0.7
Quand l'algorithme calcule le score_final pour un contenu géo-neutre
Alors score_final = (0.25 × 0.2) + (0.9 × 0.6) + (0.7 × 0.2)
Et score_final = 0.05 + 0.54 + 0.14 = 0.73
Et le contenu est bien recommandé grâce aux intérêts élevés
Scénario: Comparaison scores - géo proche vs intérêts élevés
Étant donné deux contenus:
| contenu | type | distance | score_geo | tags | jauges_user | score_interets | score_engagement |
| Info trafic locale | Géo-ancré | 100m | 1.0 | Trafic | 0% | 0.0 | 0.6 |
| Podcast philosophie | Géo-neutre | 150 km | 0.25 | Philosophie | 90% | 0.9 | 0.7 |
Quand l'algorithme calcule les scores finaux
Alors score_final("Info trafic locale") = 0.82
Et score_final("Podcast philosophie") = 0.73
Et "Info trafic locale" sera proposé avant "Podcast philosophie"
Et les deux contenus sont recommandables selon leurs critères différents