99 lines
3.7 KiB
Markdown
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)
|