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

99 lines
3.7 KiB
Markdown

# 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)