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

@@ -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,137 +0,0 @@
# ADR-011 : Conformité App Stores et Plateformes Auto
**Statut** : Accepté avec actions requises
**Date** : 2026-01-20
## Contexte
RoadWave est une app audio géolocalisée utilisée en conduite (CarPlay/Android Auto) avec :
- Contenu généré par utilisateurs (UGC)
- Monétisation : publicités géolocalisées + Premium (4.99€ web / 5.99€ IAP)
- GPS en arrière-plan
- Partage de revenus avec créateurs (70/30)
## Décision
**Stratégie de conformité multi-plateforme** avec :
- Modération UGC robuste (IA + humain)
- Prix différenciés selon région (US/EU/Monde)
- GPS avec disclosure complète
- Paiements créateurs externes (Mangopay)
## Plateformes analysées
| Plateforme | Conformité | Points critiques |
|------------|------------|------------------|
| **Android Auto** | ✅ Conforme | API Level 35+ (Android 15+) |
| **CarPlay** | ✅ Conforme | Entitlement audio à demander |
| **Google Play** | ⚠️ Actions requises | Déclaration GPS + UGC modération |
| **App Store** | ⚠️ Actions requises | Prix différenciés US/EU |
## Conformité détaillée
### Android Auto / CarPlay ✅
- 100% audio (pas de vidéo)
- Commandes standard au volant
- Aucun achat in-car
- Like automatique = sécurité maximale
- **Notifications géolocalisées** : sonore uniquement en mode CarPlay/Android Auto (pas d'overlay visuel)
- **Action** : Demander CarPlay Audio Entitlement (Apple)
### Google Play ⚠️
**UGC (critique)** :
- Modération hybride IA + humain ✅
- 3 premiers contenus validés manuellement ✅
- Système de strikes (4 = ban) ✅
- Signalement + blocage utilisateurs ✅
**GPS Background (critique)** :
- Permission "Always Location" = **OPTIONNELLE**
- Demandée uniquement pour mode piéton (notifications arrière-plan audio-guides)
- Justification Play Console :
> "RoadWave permet aux utilisateurs de recevoir des alertes audio-guides lorsqu'ils passent à pied près de monuments/musées, même quand l'app est en arrière-plan. Cette fonctionnalité est optionnelle et peut être désactivée dans les paramètres."
- In-app disclosure obligatoire (écran dédié avant demande permission)
- Si refusée : app fonctionne en mode voiture uniquement
- **Action** : Remplir formulaire background location Play Console avec justification
**Réponses formulaire Play Console** :
| Question | Réponse |
|----------|---------|
| Why does your app need background location? | "RoadWave offers optional pedestrian mode: users receive push notifications when passing near audio-guide points (museums, monuments) even when app is in background. This feature is opt-in and can be disabled in settings." |
| Is this feature core to your app? | "No. This is an optional feature. Users can use RoadWave without background location permission (in-car mode works with foreground location only)." |
| What user value does this provide? | "Pedestrian users (tourists, museum visitors) can keep phone in pocket and receive audio-guide alerts automatically without opening the app." |
| Does a less invasive alternative exist? | "Yes. Users can use manual navigation (open app, select audio-guide). Background location is a convenience feature for hands-free experience." |
### App Store ⚠️
**Prix différenciés (légaux depuis 2025-2026)** :
- 🇺🇸 US : Lien externe autorisé (0% commission)
- 🇪🇺 EU : Paiement externe DMA (7-20% commission réduite)
- 🌍 Monde : IAP obligatoire (30% commission)
**UGC** :
- Mode Kids obligatoire (filtrage selon âge) ✅
- Système de modération + signalement ✅
**GPS Background (critique)** :
- Permission "Always Location" = **OPTIONNELLE**
- Deux strings Info.plist requises :
- `NSLocationWhenInUseUsageDescription` : explication mode voiture
- `NSLocationAlwaysAndWhenInUseUsageDescription` : explication mode piéton (optionnel)
- In-app disclosure obligatoire avant demande "Always"
- Flux two-step : When In Use → Always (si user active mode piéton)
- Si refusée : app fonctionne en mode voiture uniquement
- **Action** : Voir strings détaillés dans [05-interactions-navigation.md](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides)
### Revenus créateurs
**Position** : Paiements créateurs = "services" (comme YouTube/Uber), pas IAP
- Paiement via Mangopay Connect (externe)
- Commission stores uniquement sur Premium (IAP)
- Comparables : YouTube AdSense, TikTok Creator Fund, Uber
## Actions bloquantes avant soumission
| Action | Plateforme | Deadline | Complexité |
|--------|-----------|----------|------------|
| Demander CarPlay Audio Entitlement | Apple | Avant soumission iOS | Faible |
| Remplir formulaire background location avec justification | Google Play | Avant soumission Android | Faible |
| Implémenter disclosure GPS (écran dédié mode piéton) | iOS + Android | MVP | Moyenne |
| Rendre permission "Always Location" optionnelle | iOS + Android | MVP | Moyenne |
| Désactiver overlay visuel notification en CarPlay/Android Auto | iOS + Android | MVP | Moyenne |
| Mettre à jour strings Info.plist avec justifications détaillées | iOS | MVP | Faible |
| Finaliser système modération UGC | Google + Apple | MVP | Élevée |
**Estimation totale** : +5 jours développement avant soumission stores
## Stratégie de lancement
**Phase 1 - MVP** :
- IAP uniquement (5.99€/mois mondial)
- Modération UGC active
- GPS avec disclosure
- CarPlay/Android Auto basique
**Phase 2 - Post-validation** :
- Prix différenciés US (lien externe 4.99€)
- Paiement externe EU (DMA)
- Monétisation créateurs (Mangopay)
## Conséquences
- Formation équipe sur politiques stores
- Suivi des métriques modération (% rejet, SLA)
- Migration iOS 26 SDK (Avril 2026)
- API Level 35 Android (2026)
- Communication transparente GPS/publicités
## Sources
- [Android Auto Media Apps](https://developer.android.com/training/cars/media)
- [CarPlay Developer Guide](https://developer.apple.com/carplay)
- [Google Play UGC Policy](https://support.google.com/googleplay/android-developer/answer/9876937)
- [App Store Guidelines](https://developer.apple.com/app-store/review/guidelines/)
- [Apple DMA Update EU](https://www.revenuecat.com/blog/growth/apple-eu-dma-update-june-2025/)
- [Google Background Location 2026](https://support.google.com/googleplay/android-developer/answer/9799150)

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)