diff --git a/docs/INCONSISTENCIES-ANALYSIS.md b/docs/INCONSISTENCIES-ANALYSIS.md index 4f9a448..207f957 100644 --- a/docs/INCONSISTENCIES-ANALYSIS.md +++ b/docs/INCONSISTENCIES-ANALYSIS.md @@ -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]` diff --git a/docs/adr/001-langage-backend.md b/docs/adr/001-langage-backend.md index 1531c25..b994e08 100644 --- a/docs/adr/001-langage-backend.md +++ b/docs/adr/001-langage-backend.md @@ -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) diff --git a/docs/adr/002-protocole-streaming.md b/docs/adr/002-protocole-streaming.md index f7c76f4..f9e9f79 100644 --- a/docs/adr/002-protocole-streaming.md +++ b/docs/adr/002-protocole-streaming.md @@ -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 diff --git a/docs/adr/007-tests-bdd.md b/docs/adr/007-tests-bdd.md index 55d0ddc..4b539bc 100644 --- a/docs/adr/007-tests-bdd.md +++ b/docs/adr/007-tests-bdd.md @@ -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 diff --git a/docs/adr/012-architecture-backend.md b/docs/adr/010-architecture-backend.md similarity index 98% rename from docs/adr/012-architecture-backend.md rename to docs/adr/010-architecture-backend.md index 43cfb63..5504547 100644 --- a/docs/adr/012-architecture-backend.md +++ b/docs/adr/010-architecture-backend.md @@ -1,4 +1,4 @@ -# ADR-012 : Architecture Backend +# ADR-010 : Architecture Backend **Statut** : Accepté **Date** : 2025-01-20 diff --git a/docs/adr/010-commandes-volant.md b/docs/adr/010-commandes-volant.md deleted file mode 100644 index 1b49d6b..0000000 --- a/docs/adr/010-commandes-volant.md +++ /dev/null @@ -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) diff --git a/docs/adr/013-orm-acces-donnees.md b/docs/adr/011-orm-acces-donnees.md similarity index 98% rename from docs/adr/013-orm-acces-donnees.md rename to docs/adr/011-orm-acces-donnees.md index 1d35c8b..b5967e5 100644 --- a/docs/adr/013-orm-acces-donnees.md +++ b/docs/adr/011-orm-acces-donnees.md @@ -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) diff --git a/docs/adr/014-frontend-mobile.md b/docs/adr/012-frontend-mobile.md similarity index 99% rename from docs/adr/014-frontend-mobile.md rename to docs/adr/012-frontend-mobile.md index e355a53..50289f0 100644 --- a/docs/adr/014-frontend-mobile.md +++ b/docs/adr/012-frontend-mobile.md @@ -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) diff --git a/docs/adr/015-strategie-tests.md b/docs/adr/013-strategie-tests.md similarity index 97% rename from docs/adr/015-strategie-tests.md rename to docs/adr/013-strategie-tests.md index fd07adf..7118320 100644 --- a/docs/adr/015-strategie-tests.md +++ b/docs/adr/013-strategie-tests.md @@ -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 diff --git a/docs/adr/016-organisation-monorepo.md b/docs/adr/014-organisation-monorepo.md similarity index 96% rename from docs/adr/016-organisation-monorepo.md rename to docs/adr/014-organisation-monorepo.md index 5853098..6f2413b 100644 --- a/docs/adr/016-organisation-monorepo.md +++ b/docs/adr/014-organisation-monorepo.md @@ -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 diff --git a/docs/adr/017-hebergement.md b/docs/adr/015-hebergement.md similarity index 99% rename from docs/adr/017-hebergement.md rename to docs/adr/015-hebergement.md index 0b7457d..047e43a 100644 --- a/docs/adr/017-hebergement.md +++ b/docs/adr/015-hebergement.md @@ -1,4 +1,4 @@ -# ADR-017 : Hébergement +# ADR-015 : Hébergement **Statut** : Accepté **Date** : 2025-01-25 diff --git a/docs/adr/018-service-emailing.md b/docs/adr/016-service-emailing.md similarity index 98% rename from docs/adr/018-service-emailing.md rename to docs/adr/016-service-emailing.md index c35f9ea..43b3a1c 100644 --- a/docs/adr/018-service-emailing.md +++ b/docs/adr/016-service-emailing.md @@ -1,4 +1,4 @@ -# ADR-018 : Service d'Emailing Transactionnel +# ADR-016 : Service d'Emailing Transactionnel **Statut** : Accepté **Date** : 2026-01-26 diff --git a/docs/adr/019-notifications-geolocalisees.md b/docs/adr/017-notifications-geolocalisees.md similarity index 97% rename from docs/adr/019-notifications-geolocalisees.md rename to docs/adr/017-notifications-geolocalisees.md index 22878ab..6656671 100644 --- a/docs/adr/019-notifications-geolocalisees.md +++ b/docs/adr/017-notifications-geolocalisees.md @@ -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) diff --git a/docs/adr/020-librairies-go.md b/docs/adr/018-librairies-go.md similarity index 94% rename from docs/adr/020-librairies-go.md rename to docs/adr/018-librairies-go.md index a05b769..1b2ca23 100644 --- a/docs/adr/020-librairies-go.md +++ b/docs/adr/018-librairies-go.md @@ -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) diff --git a/docs/adr/021-geolocalisation-ip.md b/docs/adr/019-geolocalisation-ip.md similarity index 97% rename from docs/adr/021-geolocalisation-ip.md rename to docs/adr/019-geolocalisation-ip.md index 108ea84..e2d546a 100644 --- a/docs/adr/021-geolocalisation-ip.md +++ b/docs/adr/019-geolocalisation-ip.md @@ -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/ diff --git a/docs/adr/022-librairies-flutter.md b/docs/adr/020-librairies-flutter.md similarity index 94% rename from docs/adr/022-librairies-flutter.md rename to docs/adr/020-librairies-flutter.md index 11f6a5a..58407ce 100644 --- a/docs/adr/022-librairies-flutter.md +++ b/docs/adr/020-librairies-flutter.md @@ -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) diff --git a/docs/adr/023-solution-cache.md b/docs/adr/021-solution-cache.md similarity index 99% rename from docs/adr/023-solution-cache.md rename to docs/adr/021-solution-cache.md index b9d07f1..d33033b 100644 --- a/docs/adr/023-solution-cache.md +++ b/docs/adr/021-solution-cache.md @@ -1,4 +1,4 @@ -# ADR-023 : Solution de Cache +# ADR-021 : Solution de Cache **Statut** : Accepté **Date** : 2026-01-31 diff --git a/docs/adr/024-strategie-cicd-monorepo.md b/docs/adr/022-strategie-cicd-monorepo.md similarity index 98% rename from docs/adr/024-strategie-cicd-monorepo.md rename to docs/adr/022-strategie-cicd-monorepo.md index 10376fd..05dd1c8 100644 --- a/docs/adr/024-strategie-cicd-monorepo.md +++ b/docs/adr/022-strategie-cicd-monorepo.md @@ -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) diff --git a/docs/adr/011-conformite-stores-carplay-android-auto.md b/docs/compliance/stores-submission.md similarity index 95% rename from docs/adr/011-conformite-stores-carplay-android-auto.md rename to docs/compliance/stores-submission.md index d2afcd9..54a1a25 100644 --- a/docs/adr/011-conformite-stores-carplay-android-auto.md +++ b/docs/compliance/stores-submission.md @@ -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 diff --git a/docs/mobile/permissions-strategy.md b/docs/mobile/permissions-strategy.md index edbcc4c..60e634b 100644 --- a/docs/mobile/permissions-strategy.md +++ b/docs/mobile/permissions-strategy.md @@ -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) diff --git a/docs/mobile/testflight-validation-plan.md b/docs/mobile/testflight-validation-plan.md index d7bd1ab..2c4e743 100644 --- a/docs/mobile/testflight-validation-plan.md +++ b/docs/mobile/testflight-validation-plan.md @@ -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) --- diff --git a/docs/regles-metier/02-conformite-rgpd.md b/docs/regles-metier/02-conformite-rgpd.md index 892ca59..51b9efe 100644 --- a/docs/regles-metier/02-conformite-rgpd.md +++ b/docs/regles-metier/02-conformite-rgpd.md @@ -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 diff --git a/docs/regles-metier/03-centres-interet-jauges.md b/docs/regles-metier/03-centres-interet-jauges.md index d241ab3..3c8c726 100644 --- a/docs/regles-metier/03-centres-interet-jauges.md +++ b/docs/regles-metier/03-centres-interet-jauges.md @@ -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. --- diff --git a/docs/regles-metier/05-interactions-navigation.md b/docs/regles-metier/05-interactions-navigation.md index 3eb4179..2c381a5 100644 --- a/docs/regles-metier/05-interactions-navigation.md +++ b/docs/regles-metier/05-interactions-navigation.md @@ -154,7 +154,7 @@ Android (`AndroidManifest.xml`) : ``` -> 📋 **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 diff --git a/docs/regles-metier/09-abonnements-notifications.md b/docs/regles-metier/09-abonnements-notifications.md index 68c3639..7ff71c3 100644 --- a/docs/regles-metier/09-abonnements-notifications.md +++ b/docs/regles-metier/09-abonnements-notifications.md @@ -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