Files
roadwave/docs/adr/010-commandes-volant.md

3.7 KiB

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 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 :

// 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 :

// ✅ 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