# ADR-010 : Commandes au volant et likes **Statut** : Accepté **Date** : 2026-01-20 ## Contexte RoadWave est utilisée en conduisant. Les utilisateurs doivent pouvoir liker du contenu pour améliorer les recommandations, mais les commandes au volant ont des limitations : - 40% des véhicules n'ont que Suivant/Précédent/Mute - iOS/Android ne supportent pas nativement les appuis longs ou doubles-appuis - La sécurité impose des interactions minimales ## Décision **Like automatique basé sur le temps d'écoute**. **Principe** : Le système calcule automatiquement un score d'engagement basé sur le pourcentage du contenu écouté, puis applique des ajustements de jauges d'intérêt en conséquence. **Progression** : Les jauges utilisent des **points de pourcentage absolus** (addition/soustraction), **pas des pourcentages relatifs** (multiplication). > 📋 **Valeurs concrètes** : Voir [Règle 03 - Évolution des Jauges](../regles-metier/03-centres-interet-jauges.md#31-évolution-des-jauges) pour les seuils et impacts exacts. ## Alternatives considérées | Option | Compatibilité | Sécurité | Complexité | |--------|---------------|----------|------------| | **Like automatique** | 100% | Maximale | Faible | | Double-tap Pause | ~80% | Moyenne | Moyenne | | Appui long Suivant | ~95% | Faible | Élevée | | Configuration paramétrable | 100% | Variable | Très élevée | ## Justification - **Sécurité maximale** : Aucune action complexe en conduite - **Compatibilité universelle** : Fonctionne sur 100% des véhicules - **UX intuitive** : Comportement standard (Spotify, YouTube Music) - **Engagement** : Tous les contenus génèrent des signaux - **Simplicité** : Une seule logique à implémenter et maintenir ## Pattern d'Implémentation ### Architecture ``` [Audio Player] → [Listen Event Tracker] ↓ [Gauge Calculation Service] - Calcule score basé sur %écoute - Applique seuils (définis dans règles métier) - Retourne ajustement (points absolus) ↓ [Gauge Update Service] - Applique ajustement (addition/soustraction) - Applique bornes [0, 100] - Persiste en DB ``` ### Principes Clés **Calcul d'ajustement** : ```go // Pattern générique (valeurs dans règles métier) func CalculateGaugeAdjustment(listenPercentage float64) float64 { // Logique par seuils définis dans règles métier // Retourne ajustement absolu (ex: +2.0, +1.0, -0.5) } ``` **Application avec bornes** : ```go // ✅ CORRECT : Addition de points absolus newValue := currentValue + adjustment newValue = clamp(newValue, 0.0, 100.0) // ❌ INCORRECT : Multiplication (pourcentage relatif) newValue := currentValue * (1 + adjustment/100) // NE PAS FAIRE ``` **Multi-tags** : - Si contenu a plusieurs tags → chaque jauge correspondante est ajustée - Ajustement identique appliqué à toutes les jauges concernées ## Conséquences ### Technique - Tracking du temps d'écoute via le player audio - Calcul du score côté backend basé sur `completion_rate` - **Architecture à 2 services** : Calculation (calcule ajustement) + Update (applique avec bornes) - Métriques à suivre : taux de complétion, distribution des scores, feedbacks utilisateurs ### UX - Communication onboarding : "Vos likes sont automatiques selon votre temps d'écoute" - Possibilité de like manuel depuis l'app (à l'arrêt) également - **Progression linéaire** : Évite l'effet "rich get richer" (progression équitable) - Prévisibilité : Ajustements absolus, pas de calculs complexes ### Référence - **Seuils et valeurs** : Voir [Règle 03 - Évolution des Jauges](../regles-metier/03-centres-interet-jauges.md#31-évolution-des-jauges)