refactor(docs): réorganiser ADR et règles métier pour clarté

**Changements majeurs** :

1. **Suppression ADR-010 (Commandes volant et likes)** :
   - Contenu consolidé dans Règle 05 (section 5.3)
   - Raison : ADR-010 était du métier déguisé en architecture
   - Section "Implémentation Technique" ajoutée à Règle 05
   - Pattern correct (addition) vs incorrect (multiplication)

2. **Déplacement ADR-011 → Compliance** :
   - `docs/adr/011-conformite-stores.md` → `docs/compliance/stores-submission.md`
   - Raison : Nature opérationnelle/légale, pas architecture technique
   - Nouveau dossier `/docs/compliance/` créé

3. **Renumérotation ADR (010-022)** :
   - Combler les trous de numérotation (010 et 011)
   - ADR-012→010, ADR-013→011, ..., ADR-024→022
   - 22 ADR numérotés en continu (001-022)
   - Historique Git préservé (git mv)

4. **Mise à jour références** :
   - Règle 03 : ADR-010 → Règle 05 (section 5.3)
   - Règle 09 : ADR-010 → Règle 05 (section 5.3)
   - INCONSISTENCIES-ANALYSIS.md : toutes références mises à jour
   - Incohérence #15 annulée (faux problème : modes séparés)

**Résultat** :
-  Séparation claire ADR (technique) vs Règles métier (fonctionnel)
-  Documentation compliance séparée
-  Numérotation ADR continue sans trous
-  Single Source of Truth (pas de redondance)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 14:34:12 +01:00
parent b6b926b233
commit 852f6d5e16
25 changed files with 181 additions and 233 deletions

View File

@@ -16,8 +16,8 @@ Cette analyse a identifié **15 incohérences** entre les décisions d'architect
|----------|--------|---------|--------|-----------------|
| 🔴 **CRITICAL** | 2 | 14% | ✅ **RÉSOLU** | ~~avant implémentation~~ |
| 🟠 **HIGH** | 2 | 14% | ✅ **RÉSOLU** (2 résolus, 1 annulé) | ~~Résolution Sprint 1-2~~ |
| 🟡 **MODERATE** | 9 | 64% | **1 restant** (6 résolus, 1 annulé, 1 documenté) | Résolution Sprint 3-5 |
| 🟢 **LOW** | 1 | 7% | ⏳ En cours | À clarifier lors du développement |
| 🟡 **MODERATE** | 9 | 64% | **RÉSOLU** (6 résolus, 2 annulés, 1 documenté) | ~~Résolution Sprint 3-5~~ |
| 🟢 **LOW** | 1 | 7% | **ANNULÉ** (Faux problème) | ~~À clarifier lors du développement~~ |
### Impact par Domaine
@@ -36,7 +36,7 @@ Cette analyse a identifié **15 incohérences** entre les décisions d'architect
### #1 : HLS ne supporte pas les Notifications Push en Arrière-plan
**Statut** : ✅ **RÉSOLU** (ADR-019 créé)
**Statut** : ✅ **RÉSOLU** (ADR-017 créé)
| Élément | Détail |
|---------|--------|
@@ -54,7 +54,7 @@ Réel: Rien (HLS ne peut pas notifier)
```
**Solution implémentée** :
-**ADR-019** : Architecture hybride WebSocket + Firebase Cloud Messaging
-**ADR-017** : Architecture hybride WebSocket + Firebase Cloud Messaging
- Phase 1 (MVP) : Push serveur via FCM/APNS
- Phase 2 : Geofencing natif iOS/Android pour mode offline
@@ -134,11 +134,11 @@ Résultat: Audio démarre 200m APRÈS le point ❌
### #4 : ORM sqlc vs Types PostGIS
**Statut** : ✅ **RÉSOLU** (ADR-013 mis à jour)
**Statut** : ✅ **RÉSOLU** (ADR-011 mis à jour)
| Élément | Détail |
|---------|--------|
| **ADR concerné** | ADR-013 (section "Gestion des Types PostGIS") |
| **ADR concerné** | ADR-011 (section "Gestion des Types PostGIS") |
| **Règle métier** | N/A (problème technique pur) |
| **Conflit** | sqlc génère types Go depuis SQL, mais PostGIS geography/geometry ne mappent pas proprement |
| **Impact** | Risque de type `interface{}` ou `[]byte` pour géographie → perte de type safety revendiquée |
@@ -187,7 +187,7 @@ WHERE ST_DWithin(location, $1::geography, $2);
- [ ] Tests d'intégration avec Testcontainers (PostGIS réel)
- [ ] Documenter patterns dans `backend/README.md`
**Référence** : [ADR-013 - Gestion des Types PostGIS](docs/adr/013-orm-acces-donnees.md#gestion-des-types-postgis)
**Référence** : [ADR-011 - Gestion des Types PostGIS](docs/adr/011-orm-acces-donnees.md#gestion-des-types-postgis)
---
@@ -214,7 +214,7 @@ WHERE ST_DWithin(location, $1::geography, $2);
| Élément | Détail |
|---------|--------|
| **ADR concerné** | ADR-014 (Frontend Mobile, mis à jour) |
| **ADR concerné** | ADR-010 (Frontend Mobile, mis à jour) |
| **Règle métier** | Règle 05 (section 5.1.2, mis à jour), Règle 02 (RGPD) |
| **Conflit** | ~~Package `geofence_service` choisi, mais pas de doc sur compatibilité permissions "optionnelles"~~ |
| **Impact** | ~~Risque de rejet App Store/Play Store si permissions obligatoires mal gérées~~ |
@@ -252,7 +252,7 @@ class GeofencingService {
```
**Actions complétées** :
- [x] ✅ ADR-014 mis à jour avec section complète "Stratégie de Permissions"
- [x] ✅ ADR-010 mis à jour avec section complète "Stratégie de Permissions"
- [x] ✅ Règle 05 (section 5.1.2) mise à jour avec clarifications permissions progressive
- [x] ✅ Documentation détaillée créée : `/docs/mobile/permissions-strategy.md`
- [x] ✅ Plan de validation TestFlight créé : `/docs/mobile/testflight-validation-plan.md`
@@ -266,7 +266,7 @@ class GeofencingService {
- ✅ Plan de validation beta (TestFlight + Play Console Internal Testing)
**Références** :
- [ADR-014 - Stratégie de Permissions](../adr/014-frontend-mobile.md#stratégie-de-permissions-iosandroid)
- [ADR-010 - Stratégie de Permissions](../adr/010-frontend-mobile.md#stratégie-de-permissions-iosandroid)
- [Documentation Permissions](../mobile/permissions-strategy.md)
- [Plan Validation TestFlight](../mobile/testflight-validation-plan.md)
- [Règle 05 - Mode Piéton](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides)
@@ -281,7 +281,7 @@ class GeofencingService {
| Élément | Détail |
|---------|--------|
| **ADR concerné** | ADR-010 (Commandes Volant, mis à jour) |
| **ADR concerné** | Règle 05 (section 5.3) (Commandes Volant, mis à jour) |
| **Règle métier** | Règle 03 (Centres d'intérêt, mis à jour) |
| **Conflit** | ~~ADR dit "+2 **points**", Règle dit "+2**%**" pour même action~~ |
| **Impact** | ~~Ambiguïté sur calcul : +2 points absolus ou +2% relatifs ?~~ |
@@ -306,34 +306,30 @@ NOT 45 × 1.02 = 45.9% ❌
- ✅ **Prédictibilité UX** : "+2%" signifie vraiment +2 points de pourcentage
**Actions complétées** :
- [x] ✅ ADR-010 mis à jour : "points" → "+2%" avec note explicite "points de pourcentage absolus"
- [x] ✅ ADR-010 : Section "Implémentation Technique" ajoutée avec code Go complet
- [x] ✅ Règle 05 (section 5.3) mis à jour : "points" → "+2%" avec note explicite "points de pourcentage absolus"
- [x] ✅ Règle 05 (section 5.3) : Section "Implémentation Technique" ajoutée (architecture 2 services)
- [x] ✅ Règle 03 : Note ajoutée clarifiant calcul absolu vs relatif
- [x] ✅ Règle 03 : Exemples de calcul vérifiés et cohérents
- [x] ✅ Référence croisée ADR-010 ↔ Règle 03
- [x] ✅ Référence croisée Règle 05 (section 5.3) ↔ Règle 03
- [x] ✅ ADR-010 supprimé : Contenu consolidé dans Règle 05 (métier) pour éviter redondance
**Changements apportés** :
**ADR-010** :
**Règle 05 (section 5.3)** :
- Règles reformulées : "+2 **points**" → "**+2%**" (points de pourcentage absolus)
- Note explicite ajoutée : "Par exemple, si jauge = 45%, +2% → 47%"
- Nouvelle section "Implémentation Technique" avec formule Go :
```go
func CalculateGaugeIncrease(listenPercentage float64) float64 {
if listenPercentage >= 80.0 { return 2.0 } // +2 points de pourcentage
// ...
}
```
- Nouvelle section "Implémentation Technique" avec architecture 2 services (Calculation + Update)
- Pattern de calcul correct (addition) vs incorrect (multiplication)
- Exemples de calcul concrets
**Règle 03** :
- Tableau mis à jour : valeurs en gras (**+2%**, **+1%**, etc.)
- Note importante ajoutée : "points de pourcentage absolus, PAS relatifs"
- Exemple anti-pattern : "NOT 45 × 1.02 = 45.9% ❌"
- Référence croisée vers ADR-010 pour implémentation
- Référence croisée vers Règle 05 (section 5.3) pour implémentation
**Références** :
- [ADR-010 - Implémentation Technique](../adr/010-commandes-volant.md#implémentation-technique)
- [Règle 05 - Implémentation Technique](../regles-metier/05-interactions-navigation.md#implémentation-technique-backend)
- [Règle 03 - Évolution des Jauges](../regles-metier/03-centres-interet-jauges.md#31-évolution-des-jauges)
---
@@ -392,11 +388,11 @@ User → Formulaire email/password (app mobile)
### #9 : GeoIP Database (MaxMind)
**Statut** : ✅ **RÉSOLU** (ADR-021 créé)
**Statut** : ✅ **RÉSOLU** (ADR-019 créé)
| Élément | Détail |
|---------|--------|
| **ADR concerné** | ADR-021 (créé) |
| **ADR concerné** | ADR-019 (créé) |
| **Règle métier** | Règle 02 (RGPD, mis à jour) |
| **Conflit** | ~~Règle citait "MaxMind GeoLite2 (gratuit)", mais offre a changé en 2019~~ |
| **Impact** | ~~Coût caché potentiel~~ |
@@ -434,14 +430,14 @@ User → Formulaire email/password (app mobile)
- ✅ Mise à jour mensuelle automatisable
**Actions complétées** :
- [x] ✅ ADR-021 créé : Service de Géolocalisation par IP
- [x] ✅ ADR-019 créé : Service de Géolocalisation par IP
- [x] ✅ Règle 02 mise à jour (ligne 147 et 317)
**Actions requises** :
- [ ] Backend : Implémenter service GeoIP avec IP2Location
- [ ] DevOps : Cron job màj mensuelle de la DB
**Référence** : [ADR-021 - Service de Géolocalisation par IP](../adr/021-geolocalisation-ip.md)
**Référence** : [ADR-019 - Service de Géolocalisation par IP](../adr/019-geolocalisation-ip.md)
---
@@ -451,7 +447,7 @@ User → Formulaire email/password (app mobile)
| Élément | Détail |
|---------|--------|
| **ADR concernés** | ADR-007 (mis à jour), ADR-015 (Stratégie, lignes 59-62) |
| **ADR concernés** | ADR-007 (mis à jour), ADR-011 (Stratégie, lignes 59-62) |
| **Règle métier** | Toutes (Gherkin) |
| **Conflit** | ~~Features partagées `/features`, step definitions séparées → qui exécute quoi ?~~ |
| **Impact** | ~~Risque de divergence backend/mobile si tests pas synchronisés~~ |
@@ -496,17 +492,17 @@ User → Formulaire email/password (app mobile)
**Changements apportés** :
- ✅ 93 features réorganisées en 3 catégories (api/ui/e2e)
- ✅ ADR-007 mis à jour avec section complète "Convention de Catégorisation"
- ✅ ADR-016 mis à jour avec stratégie CI/CD path filters (documentée, implémentation reportée)
- ✅ ADR-014 mis à jour avec stratégie CI/CD path filters (documentée, implémentation reportée)
- ✅ Historique Git préservé via `git mv` (pas de perte d'historique)
**Actions complétées** :
- [x] ✅ Réorganiser `/features` en 3 catégories (api, ui, e2e)
- [x] ✅ Mettre à jour ADR-007 avec convention de nommage et exemples
- [x] ⏸️ CI/CD : Documenté dans ADR-016 (implémentation reportée jusqu'au développement backend/mobile)
- [x] ⏸️ CI/CD : Documenté dans ADR-014 (implémentation reportée jusqu'au développement backend/mobile)
**Références** :
- [ADR-007 - Convention de Catégorisation](../adr/007-tests-bdd.md#convention-de-catégorisation)
- [ADR-024 - Stratégie CI/CD Path Filters](../adr/024-strategie-cicd-monorepo.md)
- [ADR-020 - Stratégie CI/CD Path Filters](../adr/020-strategie-cicd-monorepo.md)
---
@@ -570,7 +566,7 @@ User → Formulaire email/password (app mobile)
| Élément | Détail |
|---------|--------|
| **ADR concernés** | ADR-016 (Monorepo, mis à jour) |
| **ADR concernés** | ADR-014 (Monorepo, mis à jour) |
| **Règle métier** | N/A (problème CI/CD) |
| **Conflit initial** | ~~Path filters pour éviter rebuild tout, mais features partagées déclenchent tout~~ |
| **Impact** | ~~Optimisation CI/CD inefficace~~ → **Résolu par catégorisation #10** |
@@ -608,7 +604,7 @@ on:
**Changements apportés** :
- ✅ Catégorisation features (point #10) : **résolue** → permet path filters sélectifs
- ✅ ADR-016 mis à jour avec section complète "Stratégie CI/CD avec Path Filters"
- ✅ ADR-014 mis à jour avec section complète "Stratégie CI/CD avec Path Filters"
- Architecture workflows séparés (backend.yml, mobile.yml, shared.yml)
- Configuration path filters détaillée
- Tableau de déclenchement par type de modification
@@ -616,13 +612,13 @@ on:
**Actions complétées** :
- [x] ✅ Catégorisation features implémentée (résolution #10)
- [x] ✅ ADR-016 mis à jour avec stratégie path filters complète
- [x] ✅ ADR-014 mis à jour avec stratégie path filters complète
- [x] ⏸️ Implémentation workflows CI/CD : **Reportée jusqu'à l'implémentation du code backend/mobile**
**Note importante** : Le projet est actuellement en **phase de documentation uniquement** (aucun code backend/mobile implémenté). L'implémentation des workflows CI/CD sera faite lors du Sprint d'implémentation backend/mobile.
**Références** :
- [ADR-024 - Stratégie CI/CD Path Filters](../adr/024-strategie-cicd-monorepo.md)
- [ADR-020 - Stratégie CI/CD Path Filters](../adr/020-strategie-cicd-monorepo.md)
- Point #10 résolu (catégorisation features)
---
@@ -633,7 +629,7 @@ on:
| Élément | Détail |
|---------|--------|
| **ADR concernés** | ADR-018 (mis à jour) |
| **ADR concernés** | ADR-016 (mis à jour) |
| **Règle métier** | N/A (économique) |
| **Conflit initial** | ~~ADR citait "gratuit" mais volume estimé dépassait 9000 emails/mois~~ |
| **Impact initial** | ~~Coût surprise lors de la croissance~~ |
@@ -679,11 +675,11 @@ Total: ~0.28 emails/user/mois
- Upgrade temporaire Lite (19€) si pic > 300/jour sur 3+ jours
**Actions complétées** :
- [x] ✅ ADR-018 mis à jour avec périmètre strict et projection coûts
- [x] ✅ ADR-016 mis à jour avec périmètre strict et projection coûts
- [x] ✅ Clarification : pas d'emails notifications/marketing/paiements
- [x] ✅ Stratégie gestion pics d'inscription documentée
**Référence** : [ADR-018 - Service d'Emailing Transactionnel](../adr/018-service-emailing.md)
**Référence** : [ADR-016 - Service d'Emailing Transactionnel](../adr/016-service-emailing.md)
---
@@ -693,15 +689,15 @@ Total: ~0.28 emails/user/mois
| Élément | Détail |
|---------|--------|
| **ADR concernés** | ADR-017 (mis à jour), ADR-001 (mis à jour) |
| **ADR concernés** | ADR-015 (mis à jour), ADR-001 (mis à jour) |
| **Règle métier** | N/A (infrastructure) |
| **Conflit initial** | ~~ADR-001 justifiait Go pour "Kubernetes first-class", mais ADR-017 utilisait VPS simple~~ |
| **Conflit initial** | ~~ADR-001 justifiait Go pour "Kubernetes first-class", mais ADR-015 utilisait VPS simple~~ |
| **Impact initial** | ~~Ambiguïté : Go choisi pour K8s mais K8s pas utilisé en MVP~~ |
**Analyse** :
- **ADR-001 initial** : Mentionnait "Kubernetes first-class" dans tooling natif
- **ADR-017 initial** : MVP sur OVH VPS Essential (Docker Compose), K8s à "100K+ users"
- **ADR-015 initial** : MVP sur OVH VPS Essential (Docker Compose), K8s à "100K+ users"
- **Problème perçu** : Incohérence entre choix Go (pour K8s) et infra MVP (pas K8s)
**Clarification apportée** :
@@ -721,7 +717,7 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
- Go choisi **principalement** pour simplicité, écosystème, performance
- Support K8s = **bonus** scalabilité future, pas driver du choix
**ADR-017** : Section complète "Roadmap Infrastructure" ajoutée :
**ADR-015** : Section complète "Roadmap Infrastructure" ajoutée :
| Phase | Users | Infrastructure | Trigger principal |
|-------|-------|----------------|-------------------|
@@ -735,12 +731,12 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
**Actions complétées** :
- [x] ✅ ADR-001 mis à jour : Note explicite "K8s = bonus, pas raison principale"
- [x] ✅ ADR-017 : Section "Roadmap Infrastructure" complète (3 phases + triggers)
- [x] ✅ ADR-015 : Section "Roadmap Infrastructure" complète (3 phases + triggers)
- [x] ✅ Cohérence architecture : Vision long-terme clarifiée sans sur-architecture MVP
**Références** :
- [ADR-001 - Justification Go (K8s bonus)](../adr/001-langage-backend.md#pourquoi-go-plutôt-que-rust-)
- [ADR-017 - Roadmap Infrastructure](../adr/017-hebergement.md#roadmap-infrastructure)
- [ADR-015 - Roadmap Infrastructure](../adr/015-hebergement.md#roadmap-infrastructure)
---
@@ -748,29 +744,40 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
### #15 : Unlike Manuel sur Contenu Auto-liké
**Statut** : ✅ **ANNULÉ** (Faux problème - séparation mode voiture/piéton)
| Élément | Détail |
|---------|--------|
| **ADR concerné** | ADR-010 (ligne 15-21) |
| **Règle métier** | Règle 05 (lignes 248-323), Règle 03 (lignes 93-99) |
| **Conflit** | Auto-like +2% documenté, mais unlike manuel non spécifié |
| **Impact** | Ambiguïté : faut-il annuler (+2%) si unlike ? |
| **ADR concerné** | Règle 05 (section 5.3) (ligne 15-21) |
| **Règle métier** | Règle 05 (lignes 343-346, "Disponibilité"), Règle 03 (lignes 93-99) |
| **Conflit initial** | ~~Auto-like +2% documenté, mais unlike manuel non spécifié~~ |
| **Impact initial** | ~~Ambiguïté : faut-il annuler (+2%) si unlike ?~~ |
**Scénario** :
**Raison de l'annulation** : Le scénario du conflit **ne peut pas se produire** car les deux fonctionnalités sont **mutuellement exclusives** selon le mode de déplacement :
**Séparation stricte par mode** (Règle 05, lignes 343-346) :
- **Mode voiture** (vitesse ≥ 5 km/h) :
- ✅ Auto-like actif (basé sur temps d'écoute)
- ❌ **Pas de bouton Unlike** (aucune action manuelle, sécurité routière)
- **Mode piéton** (vitesse < 5 km/h) :
- ✅ Bouton Like/Unlike disponible (interactions manuelles)
- ❌ **Pas d'auto-like** (seulement actions explicites)
**Scénario impossible** :
```
1. Utilisateur écoute 85% → auto-like → jauge +2%
2. Utilisateur clique "Unlike" (toggle)
3. Que se passe-t-il ?
Option A: Jauge -2% (annulation)
Option B: Jauge reste (unlike n'affecte pas)
1. Utilisateur écoute 85% en mode voiture → auto-like → jauge +2%
→ Pas de bouton Unlike (mode conduite) ❌
2. Utilisateur en mode piéton → bouton Unlike disponible
→ Pas d'auto-like (seulement like manuel) ❌
```
**Recommandation** : **Option A** (annulation symétrique)
**Justification** :
- L'écoute longue (85%) **éveille la curiosité** (justifie auto-like en mode voiture)
- Le unlike ne se fait **qu'en mode piéton** (où il n'y a pas d'auto-like)
- Les deux systèmes sont **isolés** et ne peuvent pas interagir
**Justification** : Unlike explicite = signal fort "pas intéressé"
**Actions** :
- [ ] Clarifier Règle 03 : section "Unlike Manuel"
- [ ] Backend : Implémenter logique annulation dans `GaugeService`
**Aucune action requise** : Ce point est un faux problème et peut être ignoré.
---
@@ -780,7 +787,7 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
| # | Tâche | Responsable | Effort | Deadline |
|---|-------|-------------|--------|----------|
| 1 | ✅ Créer ADR-019 (Notifications) | Architecture | 2h | ✅ Fait |
| 1 | ✅ Créer ADR-017 (Notifications) | Architecture | 2h | ✅ Fait |
| 2 | ✅ Mettre à jour ADR-002 (Pre-buffering) | Architecture | 1h | ✅ Fait |
| 3 | Implémenter WebSocket backend | Backend Lead | 3j | Sprint 1 |
| 4 | Implémenter Pre-buffer mobile | Mobile Lead | 2j | Sprint 1 |
@@ -798,13 +805,13 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
| # | Tâche | Responsable | Effort | Statut |
|---|-------|-------------|--------|--------|
| 9 | ✅ Clarification Points vs Pourcentages (ADR-010 + Règle 03) | Tech Writer | 0.5j | ✅ **Fait** |
| 9 | ✅ Clarification Points vs Pourcentages (Règle 05 + Règle 03, ADR-010 supprimé) | Tech Writer | 0.5j | ✅ **Fait** |
| 10 | ✅ Clarification OAuth2 protocole vs providers (ADR-008 + Règle 01) | Tech Writer | 0.5j | ✅ **Fait** |
| 11 | ✅ GeoIP Database (ADR-021 + Règle 02) | Tech Writer | 0.5j | ✅ **Fait** |
| 12 | ✅ Réorganisation features BDD + CI/CD path filters (ADR-007, ADR-024) | QA Lead | 2j | ✅ **Fait** |
| 13 | ✅ Projection coûts Email (ADR-018, périmètre réduit) | Tech Writer | 0.5j | ✅ **Fait** |
| 14 | ✅ Clarification Kubernetes (ADR-001, ADR-017 roadmap) | Tech Writer | 0.5j | ✅ **Fait** |
| 15 | Clarification Unlike Manuel (Règle 03 + ADR-010) | Tech Writer | 0.5j | ⏳ Sprint 3-4 |
| 11 | ✅ GeoIP Database (ADR-019 + Règle 02) | Tech Writer | 0.5j | ✅ **Fait** |
| 12 | ✅ Réorganisation features BDD + CI/CD path filters (ADR-007, ADR-020) | QA Lead | 2j | ✅ **Fait** |
| 13 | ✅ Projection coûts Email (ADR-016, périmètre réduit) | Tech Writer | 0.5j | ✅ **Fait** |
| 14 | ✅ Clarification Kubernetes (ADR-001, ADR-015 roadmap) | Tech Writer | 0.5j | ✅ **Fait** |
| 15 | Unlike Manuel (Faux problème - modes séparés) | Tech Writer | 0.5j | ❌ **Annulé** |
---
@@ -814,23 +821,26 @@ Kubernetes est un **bonus** pour scalabilité future (Phase 3 : 100K+ users), **
|----------|----------------|-------|--------|
| Incohérences CRITICAL | 2 | 0 | ✅ **0** (2/2 résolues) |
| Incohérences HIGH | 4 | 0 | ✅ **0** (2 résolues, 1 annulée) |
| Incohérences MODERATE | 9 | ≤2 | ✅ **1 restante** (#7-#14 traités : 6 résolus + 1 annulé + 1 documenté) |
| ADR à jour | 66% (12/18) | 100% | ✅ **100%** (19/19 - ADR-018 mis à jour) |
| Incohérences MODERATE | 9 | ≤2 | ✅ **0** (6 résolus, 2 annulés, 1 documenté) |
| Incohérences LOW | 1 | 0 | ✅ **0** (1 annulée) |
| ADR à jour | 66% (12/18) | 100% | ✅ **100%** (19/19 - ADR-016 mis à jour) |
| Coverage documentation | N/A | >90% | ✅ **95%** |
**Dernière mise à jour** : 2026-02-01
**Détail MODERATE** :
- ✅ **Traités (8/9)** : #7 (résolu), #8 (résolu), #9 (résolu), #10 (résolu), #11 (annulé), #12 (documenté), #13 (résolu), #14 (résolu)
- ⏳ **Restant (1/9)** : #15 (Unlike Manuel)
- ✅ **Traités (9/9)** : #7 (résolu), #8 (résolu), #9 (résolu), #10 (résolu), #11 (annulé), #12 (documenté), #13 (résolu), #14 (résolu), #15 (annulé)
**Détail LOW** :
- ✅ **Traité (1/1)** : #15 (Unlike Manuel - annulé, reclassé de MODERATE → LOW puis annulé car faux problème)
---
## Contacts et Ressources
- **Analyse complète** : Ce document
- **ADR-019** : `/docs/adr/019-notifications-geolocalisees.md`
- **ADR-021** : `/docs/adr/021-geolocalisation-ip.md`
- **ADR-017** : `/docs/adr/017-notifications-geolocalisees.md`
- **ADR-019** : `/docs/adr/019-geolocalisation-ip.md`
- **ADR-002 (mis à jour)** : `/docs/adr/002-protocole-streaming.md`
- **Questions** : Créer une issue GitHub avec tag `[architecture]`

View File

@@ -48,7 +48,7 @@ Rust offre meilleures performances absolues (2M conn/serveur vs 1M, 0 GC pauses)
- pprof intégré (CPU, mémoire)
- race detector systématique
- Cold start ~10ms (vs ~50ms Rust)
- **Scalabilité future** : Excellent support Kubernetes (migration prévue à 100K+ users, voir [ADR-017](017-hebergement.md#roadmap-infrastructure))
- **Scalabilité future** : Excellent support Kubernetes (migration prévue à 100K+ users, voir [ADR-015](015-hebergement.md#roadmap-infrastructure))
**Note importante** : Kubernetes n'est **pas utilisé en MVP** (Docker Compose sur VPS suffit pour 0-20K users). Go est choisi **principalement** pour sa **simplicité**, son **écosystème mature** et ses **performances concurrentielles**. Le support K8s est un **bonus** pour la scalabilité future, pas la raison principale du choix.
@@ -66,4 +66,4 @@ Rust offre meilleures performances absolues (2M conn/serveur vs 1M, 0 GC pauses)
- Monitoring GC pauses en production (cibler < 20ms p95)
- Potential migration partielle à Rust pour services critiques post-Series A
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour stack complet (16 librairies validées)
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour stack complet (16 librairies validées)

View File

@@ -179,4 +179,4 @@ Si le pre-buffer échoue (réseau faible, pas de cache), afficher un **loader av
- [Low-Latency HLS (LL-HLS)](https://developer.apple.com/documentation/http_live_streaming/enabling_low-latency_hls)
- Règle Métier 05 : Section 5.2 (Mode Voiture, lignes 16-84)
- Règle Métier 17 : Section 17.2 (ETA Géolocalisé, lignes 25-65)
- **ADR-019** : Architecture des Notifications Géolocalisées
- **ADR-017** : Architecture des Notifications Géolocalisées

View File

@@ -146,4 +146,4 @@ Feature: Recommandation géolocalisée
- Les use cases du README doivent être traduits en `.feature`
- CI exécute `godog run` avant chaque merge
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour analyse complète des frameworks BDD
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour analyse complète des frameworks BDD

View File

@@ -1,4 +1,4 @@
# ADR-012 : Architecture Backend
# ADR-010 : Architecture Backend
**Statut** : Accepté
**Date** : 2025-01-20

View File

@@ -1,98 +0,0 @@
# 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)

View File

@@ -1,4 +1,4 @@
# ADR-013 : ORM et Accès Données
# ADR-011 : ORM et Accès Données
**Statut** : Accepté
**Date** : 2025-01-20
@@ -208,4 +208,4 @@ ON user_locations USING GIST(last_position);
- Migrations gérées séparément avec `golang-migrate`
- CI doit exécuter `sqlc generate` pour valider cohérence SQL/Go
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour stack complet (sqlc + golang-migrate + pgx)
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour stack complet (sqlc + golang-migrate + pgx)

View File

@@ -1,4 +1,4 @@
# ADR-014 : Frontend Mobile
# ADR-012 : Frontend Mobile
**Statut** : Accepté
**Date** : 2025-01-20
@@ -31,7 +31,7 @@ RoadWave nécessite applications iOS et Android avec support CarPlay/Android Aut
## Packages Flutter
> **Voir [ADR-022 - Librairies Flutter](022-librairies-flutter.md)** pour la liste complète des packages, licences, alternatives considérées et justifications détaillées.
> **Voir [ADR-020 - Librairies Flutter](020-librairies-flutter.md)** pour la liste complète des packages, licences, alternatives considérées et justifications détaillées.
**Packages clés pour RoadWave** :
@@ -46,7 +46,7 @@ RoadWave nécessite applications iOS et Android avec support CarPlay/Android Aut
**Points d'attention** :
- ⚠️ **Permissions progressives requises** pour `geofence_service` et `geolocator` (voir section "Stratégie de Permissions")
- ⚠️ **Licences** : 100% permissives (MIT, BSD-3) - voir ADR-022
- ⚠️ **Licences** : 100% permissives (MIT, BSD-3) - voir ADR-020
## Stratégie de Permissions (iOS/Android)

View File

@@ -1,4 +1,4 @@
# ADR-015 : Stratégie Tests
# ADR-013 : Stratégie Tests
**Statut** : Accepté
**Date** : 2025-01-20
@@ -83,4 +83,4 @@ Approche **multi-niveaux** : unitaires, intégration, BDD (Gherkin), E2E, load t
- Tests intégration/E2E : nightly builds (15-30 min)
- Load tests : avant chaque release majeure
**Librairies** : Voir [ADR-020](020-librairies-go.md) pour analyses complètes des frameworks de tests
**Librairies** : Voir [ADR-018](018-librairies-go.md) pour analyses complètes des frameworks de tests

View File

@@ -1,4 +1,4 @@
# ADR-016 : Organisation en Monorepo
# ADR-014 : Organisation en Monorepo
**Statut** : Accepté
**Date** : 2025-01-24
@@ -77,7 +77,7 @@ Cela garantit que :
- **Turborepo** ou **Nx** : orchestration des builds/tests, cache intelligent
- **Docker Compose** : environnement de dev local (PostgreSQL, Redis, backend, etc.)
- **Make** : commandes communes (`make test`, `make build`, `make dev`)
- **CI/CD** : GitHub Actions avec path filters (voir [ADR-024](024-strategie-cicd-monorepo.md))
- **CI/CD** : GitHub Actions avec path filters (voir [ADR-020](020-strategie-cicd-monorepo.md))
## Conséquences

View File

@@ -1,4 +1,4 @@
# ADR-017 : Hébergement
# ADR-015 : Hébergement
**Statut** : Accepté
**Date** : 2025-01-25

View File

@@ -1,4 +1,4 @@
# ADR-018 : Service d'Emailing Transactionnel
# ADR-016 : Service d'Emailing Transactionnel
**Statut** : Accepté
**Date** : 2026-01-26

View File

@@ -1,4 +1,4 @@
# ADR-019 : Architecture des Notifications Géolocalisées
# ADR-017 : Architecture des Notifications Géolocalisées
**Statut** : Accepté
**Date** : 2026-01-28
@@ -100,7 +100,7 @@ Architecture hybride en **2 phases** :
- **Batterie** : Utilise les mécanismes système (Google Play Services)
- **Cross-platform** : API unifiée iOS/Android
### Incohérence acceptée : Firebase vs self-hosted (ADR-008, ADR-017)
### Incohérence acceptée : Firebase vs self-hosted (ADR-008, ADR-015)
**Problème** : RoadWave promeut 100% self-hosted + souveraineté française, mais Firebase = dépendance Google Cloud.
@@ -150,7 +150,7 @@ Architecture hybride en **2 phases** :
### Négatives
- ⚠️ **Dépendance Google (Firebase)** : Contradictoire avec ADR-008 (self-hosted) + ADR-017 (souveraineté FR)
- ⚠️ **Dépendance Google (Firebase)** : Contradictoire avec ADR-008 (self-hosted) + ADR-015 (souveraineté FR)
- Mitigé par abstraction layer (`NotificationProvider` interface) → swap facile si besoin
- Exit path documenté pour migration custom (< 1 sprint)
- ⚠️ **Données utilisateur chez Google** : Tokens FCM, timestamps notifications
@@ -163,8 +163,8 @@ Architecture hybride en **2 phases** :
- **ADR-002 (Streaming)** : Aucun conflit - HLS reste pour l'audio
- **ADR-005 (Base de données)** : Ajouter index PostGIS `GIST (geom)` sur `points_of_interest`
- **ADR-012 (Architecture Backend)** : Ajouter un module `geofencing` avec worker dédié
- **ADR-014 (Frontend Mobile)** : Intégrer `firebase_messaging` (Flutter) et gérer permissions
- **ADR-010 (Architecture Backend)** : Ajouter un module `geofencing` avec worker dédié
- **ADR-010 (Frontend Mobile)** : Intégrer `firebase_messaging` (Flutter) et gérer permissions
## Abstraction Layer (Mitigation Vendor Lock-in)

View File

@@ -1,4 +1,4 @@
# ADR-020 : Librairies Go du Backend
# ADR-018 : Librairies Go du Backend
**Statut** : Accepté
**Date** : 2026-01-31
@@ -22,7 +22,7 @@ Utilisation de **16 librairies open-source** avec licences permissives.
| **HTTP Framework** | `gofiber/fiber/v3` | MIT | 36K RPS, WebSocket natif, Express-like |
| **PostgreSQL** | `jackc/pgx/v5` | MIT | 30-50% plus rapide, PostGIS natif |
| **Redis** | `redis/rueidis` | Apache-2.0 | Client-side caching, GEORADIUS |
| **SQL Codegen** | `sqlc-dev/sqlc` | MIT | Type-safe, zero overhead (ADR-013) |
| **SQL Codegen** | `sqlc-dev/sqlc` | MIT | Type-safe, zero overhead (ADR-011) |
| **Migrations** | `golang-migrate/migrate` | MIT | Standard, CLI + library |
### Tests
@@ -40,8 +40,8 @@ Utilisation de **16 librairies open-source** avec licences permissives.
|-----------|-----------|---------|---------------|
| **Auth JWT** | `zitadel/zitadel-go/v3` | Apache-2.0 | SDK Zitadel officiel (ADR-008) |
| **WebRTC** | `pion/webrtc/v4` | MIT | Pure Go, radio live (ADR-002) |
| **WebSocket** | `coder/websocket` | ISC | Minimal, notifications (ADR-019) |
| **FCM Push** | `firebase.google.com/go` | BSD-3 | SDK Google officiel (ADR-019) |
| **WebSocket** | `coder/websocket` | ISC | Minimal, notifications (ADR-017) |
| **FCM Push** | `firebase.google.com/go` | BSD-3 | SDK Google officiel (ADR-017) |
| **HLS/FFmpeg** | `asticode/go-astiav` | MIT | Bindings FFmpeg n8.0 |
### Utilitaires
@@ -88,7 +88,7 @@ Voir [analyse détaillée](../ANALYSE_LIBRAIRIES_GO.md) pour comparatifs complet
### Négatives
- ⚠️ **k6 (AGPL-3.0)** : Copyleft, mais OK pour tests internes (pas de SaaS k6 prévu)
- ⚠️ **Firebase FCM** : Dépendance Google (mitigation via abstraction layer, ADR-019)
- ⚠️ **Firebase FCM** : Dépendance Google (mitigation via abstraction layer, ADR-017)
- ❌ Courbe d'apprentissage : 16 librairies à maîtriser (doc nécessaire)
### Dépendances go.mod
@@ -119,6 +119,6 @@ require (
- [Analyse complète des librairies](../ANALYSE_LIBRAIRIES_GO.md) (tableaux comparatifs, sources)
- ADR-001 : Langage Backend (Fiber, pgx, go-redis)
- ADR-007 : Tests BDD (Godog)
- ADR-013 : Accès données (sqlc)
- ADR-015 : Stratégie tests (testify, testcontainers, k6)
- ADR-019 : Notifications (WebSocket, FCM)
- ADR-011 : Accès données (sqlc)
- ADR-011 : Stratégie tests (testify, testcontainers, k6)
- ADR-017 : Notifications (WebSocket, FCM)

View File

@@ -1,4 +1,4 @@
# ADR-021 : Service de Géolocalisation par IP
# ADR-019 : Service de Géolocalisation par IP
**Statut** : Accepté
**Date** : 2026-01-31
@@ -113,6 +113,6 @@ flowchart TD
## Références
- [ADR-004 : CDN (Souveraineté)](004-cdn.md)
- [ADR-017 : Hébergement](017-hebergement.md)
- [ADR-015 : Hébergement](015-hebergement.md)
- [Règle 02 : RGPD (Mode Dégradé)](../regles-metier/02-conformite-rgpd.md#136-géolocalisation-optionnelle)
- IP2Location Lite : https://lite.ip2location.com/

View File

@@ -1,4 +1,4 @@
# ADR-022 : Librairies Flutter du Mobile
# ADR-020 : Librairies Flutter du Mobile
**Statut** : Accepté
**Date** : 2026-01-31
@@ -80,7 +80,7 @@ Utilisation de **8 librairies open-source** Flutter avec licences permissives.
- **geofence_service** : Geofencing natif, minimise consommation batterie
### Conformité Stores
- **Permissions progressives** : `permission_handler` + stratégie ADR-014
- **Permissions progressives** : `permission_handler` + stratégie ADR-010
- **Background modes** : `geolocator` + `geofence_service` approuvés stores
- **Notifications** : `flutter_local_notifications` conforme guidelines iOS/Android
@@ -143,7 +143,7 @@ graph TB
### Positives
- ✅ Aucune restriction licence commerciale (100% permissif)
- ✅ Stack cohérent avec ADR-014 (Frontend Mobile)
- ✅ Stack cohérent avec ADR-010 (Frontend Mobile)
- ✅ Performance native (compilation ARM64 directe)
- ✅ Écosystème mature et documenté
- ✅ Support CarPlay/Android Auto via communauté
@@ -151,7 +151,7 @@ graph TB
### Négatives
- ⚠️ **CarPlay/Android Auto** : Packages communautaires (pas officiels Flutter)
- ⚠️ **Géolocalisation background** : Scrutée par App Store (stratégie progressive requise, ADR-014)
- ⚠️ **Géolocalisation background** : Scrutée par App Store (stratégie progressive requise, ADR-010)
- ❌ **Courbe d'apprentissage** : Dart + pattern BLoC à maîtriser
- ❌ **Tests stores** : Validation TestFlight (iOS) et Internal Testing (Android) obligatoires
@@ -176,11 +176,11 @@ graph TB
- `flutter_carplay` - Intégration CarPlay
- `android_auto_flutter` - Support Android Auto
### Migration depuis ADR-014
### Migration depuis ADR-010
La section "Packages clés" de l'ADR-014 est désormais obsolète et doit référencer cet ADR :
La section "Packages clés" de l'ADR-010 est désormais obsolète et doit référencer cet ADR :
> **Packages Flutter** : Voir [ADR-022 - Librairies Flutter](020-librairies-flutter.md) pour la liste complète, licences et justifications.
> **Packages Flutter** : Voir [ADR-018 - Librairies Flutter](018-librairies-flutter.md) pour la liste complète, licences et justifications.
## Risques et Mitigations
@@ -190,7 +190,7 @@ La section "Packages clés" de l'ADR-014 est désormais obsolète et doit réfé
### Risque 2 : Validation App Store (permissions background)
- **Impact** : Taux de rejet ~70% si mal justifié
- **Mitigation** : Stratégie progressive (ADR-014), écrans d'éducation, tests beta TestFlight
- **Mitigation** : Stratégie progressive (ADR-010), écrans d'éducation, tests beta TestFlight
### Risque 3 : Performance audio HLS en arrière-plan
- **Impact** : Interruptions si OS tue l'app
@@ -198,8 +198,8 @@ La section "Packages clés" de l'ADR-014 est désormais obsolète et doit réfé
## Références
- ADR-014 : Frontend Mobile (Flutter, architecture permissions)
- ADR-020 : Librairies Go (même format de documentation)
- ADR-010 : Frontend Mobile (Flutter, architecture permissions)
- ADR-018 : Librairies Go (même format de documentation)
- [flutter_bloc documentation](https://bloclibrary.dev/)
- [just_audio repository](https://pub.dev/packages/just_audio)
- [geolocator documentation](https://pub.dev/packages/geolocator)

View File

@@ -1,4 +1,4 @@
# ADR-023 : Solution de Cache
# ADR-021 : Solution de Cache
**Statut** : Accepté
**Date** : 2026-01-31

View File

@@ -1,11 +1,11 @@
# ADR-024 : Stratégie CI/CD avec Path Filters pour Monorepo
# ADR-022 : Stratégie CI/CD avec Path Filters pour Monorepo
**Statut** : Accepté (non implémenté)
**Date** : 2026-02-01
## Contexte
RoadWave est organisé en monorepo contenant backend Go, mobile Flutter, documentation et features BDD ([ADR-016](016-organisation-monorepo.md)). Sans optimisation, chaque commit déclencherait **tous** les builds (backend + mobile + docs), même si seul un composant a changé.
RoadWave est organisé en monorepo contenant backend Go, mobile Flutter, documentation et features BDD ([ADR-014](014-organisation-monorepo.md)). Sans optimisation, chaque commit déclencherait **tous** les builds (backend + mobile + docs), même si seul un composant a changé.
**Problématique** :
- ❌ Temps de CI/CD inutilement longs (rebuild complet ~15 min)
@@ -252,7 +252,7 @@ jobs:
| `features/api/authentication/*.feature` | ✅ | ❌ | ❌ | ~5 min |
| `features/ui/audio-guides/*.feature` | ❌ | ✅ | ❌ | ~8 min |
| `features/e2e/abonnements/*.feature` | ✅ | ✅ | ❌ | ~13 min (parallèle) |
| `docs/adr/018-email.md` | ❌ | ❌ | ✅ | ~30s |
| `docs/adr/016-email.md` | ❌ | ❌ | ✅ | ~30s |
| **Commit mixte (backend + mobile + docs)** | ✅ | ✅ | ✅ | ~13 min (parallèle) |
**Économie de temps** :
@@ -390,7 +390,7 @@ git push
## Références
- [ADR-007 - Tests BDD et Catégorisation Features](007-tests-bdd.md)
- [ADR-016 - Organisation Monorepo](016-organisation-monorepo.md)
- [ADR-014 - Organisation Monorepo](014-organisation-monorepo.md)
- [GitHub Actions - Path Filters](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)
- [Monorepo CI/CD Best Practices](https://monorepo.tools/#ci-cd)

View File

@@ -1,7 +1,8 @@
# ADR-011 : Conformité App Stores et Plateformes Auto
# Conformité App Stores et Plateformes Auto
**Statut** : Accepté avec actions requises
**Date** : 2026-01-20
**Type de document** : Guide de soumission et compliance
**Dernière mise à jour** : 2026-01-20
**Anciennement** : ADR-011 (déplacé depuis `/docs/adr/` car nature opérationnelle)
## Contexte
@@ -11,9 +12,9 @@ RoadWave est une app audio géolocalisée utilisée en conduite (CarPlay/Android
- GPS en arrière-plan
- Partage de revenus avec créateurs (70/30)
## Décision
## Stratégie de conformité
**Stratégie de conformité multi-plateforme** avec :
**Approche multi-plateforme** avec :
- Modération UGC robuste (IA + humain)
- Prix différenciés selon région (US/EU/Monde)
- GPS avec disclosure complète

View File

@@ -109,7 +109,7 @@ La géolocalisation est **critique** pour RoadWave, mais les permissions arrièr
### Si Permission Refusée
**Mode dégradé (IP2Location)** :
- Détection pays/ville via adresse IP (IP2Location Lite, voir [ADR-021](../adr/021-geolocalisation-ip.md))
- Détection pays/ville via adresse IP (IP2Location Lite, voir [ADR-019](../adr/019-geolocalisation-ip.md))
- Contenus nationaux et régionaux disponibles
- Pas de contenus hyperlocaux (< 10km)
@@ -851,7 +851,7 @@ void main() {
## Références
- **ADR-014** : [Frontend Mobile](../adr/014-frontend-mobile.md)
- **ADR-010** : [Frontend Mobile](../adr/010-frontend-mobile.md)
- **Règle 05** : [Mode Piéton](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides)
- **Règle 02** : [Conformité RGPD](../regles-metier/02-conformite-rgpd.md)
- **Apple Guidelines** : [Location Best Practices](https://developer.apple.com/design/human-interface-guidelines/location)

View File

@@ -608,7 +608,7 @@ Location Data :
### Documentation
- [Stratégie Permissions](permissions-strategy.md)
- [ADR-014 Frontend Mobile](../adr/014-frontend-mobile.md)
- [ADR-010 Frontend Mobile](../adr/010-frontend-mobile.md)
- [Règle 05 Mode Piéton](../regles-metier/05-interactions-navigation.md)
---

View File

@@ -144,7 +144,7 @@ export-roadwave-[user_id]-[date].zip
- Upgrade volontaire vers GPS
**API GeoIP** :
- IP2Location Lite (gratuit, self-hosted, voir [ADR-021](../adr/021-geolocalisation-ip.md))
- IP2Location Lite (gratuit, self-hosted, voir [ADR-019](../adr/019-geolocalisation-ip.md))
- Update DB mensuelle automatique
- Précision ~80% au niveau ville

View File

@@ -54,7 +54,7 @@ Scénario 4 : Skip après 5s
```
**Justification** :
- **Like automatique** : Reflète l'engagement réel (voir [ADR-010](../adr/010-commandes-volant.md))
- **Like automatique** : Reflète l'engagement réel (voir [Règle 05 - Section 5.3](05-interactions-navigation.md#53-interactions-au-volant--like-automatique-et-engagement))
- **Sécurité routière** : Pas d'action complexe en conduite
- **Prévisibilité** : Règles claires et déterministes
- **Progression linéaire** : Évite l'effet "rich get richer" (progression équitable)
@@ -62,7 +62,7 @@ Scénario 4 : Skip après 5s
- **Fiabilité** : Pas d'edge cases complexes (pas de risque d'overflow avec multiplication)
- **Ajustable** : Valeurs modifiables via dashboard admin si besoin
> 📋 **Référence technique** : Voir [ADR-010 - Formule de Calcul](../adr/010-commandes-volant.md#implémentation-technique) pour l'implémentation backend détaillée.
> 📋 **Référence technique** : Voir [Règle 05 - Implémentation Technique](05-interactions-navigation.md#implémentation-technique-backend) pour l'architecture backend détaillée.
---

View File

@@ -154,7 +154,7 @@ Android (`AndroidManifest.xml`) :
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
```
> 📋 **Référence technique** : Voir [ADR-014 - Stratégie de Permissions](../adr/014-frontend-mobile.md#stratégie-de-permissions-iosandroid) pour détails d'implémentation.
> 📋 **Référence technique** : Voir [ADR-010 - Stratégie de Permissions](../adr/010-frontend-mobile.md#stratégie-de-permissions-iosandroid) pour détails d'implémentation.
**Disclosure avant demande permission** (Android requis, iOS recommandé) :
@@ -270,8 +270,6 @@ Utilisateur écoute :
### 5.3 Interactions au volant : Like automatique et engagement
> ⚠️ **Architecture Decision Record** : Voir [ADR-010](../adr/010-commandes-volant.md) pour les détails techniques complets
**Décision** : Like automatique basé sur le temps d'écoute
**Problème technique identifié** :
@@ -487,6 +485,43 @@ Utilisez les boutons au volant :
---
#### Implémentation Technique (Backend)
**Architecture** : 2 services séparés pour responsabilités distinctes
1. **Gauge Calculation Service** :
- Calcule l'ajustement basé sur % écoute (≥80% → +2%, 30-79% → +1%, skip <10s → -0.5%)
- Retourne un ajustement absolu (float64, en points de pourcentage)
- **Stateless** : logique métier pure, pas d'accès DB
- **Testable** : unitairement sans dépendances
2. **Gauge Update Service** :
- Applique l'ajustement aux jauges concernées (addition/soustraction)
- Applique les bornes [0, 100] (via fonction `clamp`)
- Gère les multi-tags : si contenu a N tags → mise à jour de N jauges
- Persiste : Redis (immédiat) + PostgreSQL (batch async)
**Séparation des responsabilités** :
-**Calculation** : Logique métier pure (réutilisable pour auto-like, skip, actions manuelles)
-**Update** : Persistance et contraintes techniques
**Pattern de calcul** :
```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
```
**Persistance** :
- **Redis** : Mise à jour immédiate (latence <10ms)
- **PostgreSQL** : Batch async toutes les 5 minutes (cohérence finale)
- Raison : Jauges consultées fréquemment (recommandations temps réel)
---
### 5.4 Lecture en boucle et enchaînement
**Décision** : Passage automatique après 2s + insertion pub paramétrable

View File

@@ -276,7 +276,7 @@ Liste des séquences :
- Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?"
**Abonnement initial** :
- Impact : **+5% toutes jauges tags du créateur** (défini en [ADR-010](../adr/010-commandes-volant.md))
- Impact : **+5% toutes jauges tags du créateur** (voir [Règle 05 - Section 5.3](05-interactions-navigation.md#actions-complémentaires-mode-piéton-uniquement))
- Action : Bouton "S'abonner" dans profil créateur (interface mobile)
- Immédiat à l'action