diff --git a/Makefile b/Makefile
index 498fe8f..13200f7 100644
--- a/Makefile
+++ b/Makefile
@@ -51,7 +51,7 @@ test-integration:
## test-bdd: Run BDD tests (Godog)
test-bdd:
@echo "$(BLUE)Running BDD tests...$(NC)"
- @godog run features/
+ @godog run docs/domains/*/features/
## test-coverage: Run tests with coverage report
test-coverage:
diff --git a/docs/REFACTOR-DDD.md b/docs/REFACTOR-DDD.md
new file mode 100644
index 0000000..9cf176f
--- /dev/null
+++ b/docs/REFACTOR-DDD.md
@@ -0,0 +1,370 @@
+# Plan de refactorisation : Organisation DDD de la documentation
+
+## đŻ Objectif
+
+Réorganiser la documentation du projet selon les principes du **Domain-Driven Design (DDD)** pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend.
+
+## đ Situation actuelle
+
+### Structure actuelle
+
+```
+docs/
+âââ regles-metier/ # 19 fichiers numĂ©rotĂ©s 01-19 + ANNEXE
+âââ diagrammes/ # OrganisĂ©s par type (flux, Ă©tats, sĂ©quences, entitĂ©s)
+â âââ flux/
+â âââ etats/
+â âââ sequence/
+â âââ entites/
+âââ adr/ # Architecture Decision Records
+âââ legal/ # Documentation lĂ©gale
+âââ interfaces/ # Interfaces UI
+```
+
+### ProblÚmes identifiés
+
+1. **Organisation séquentielle** : Numérotation 01-19 ne reflÚte pas les domaines métier
+2. **Diagrammes dispersés** : Séparés des rÚgles métier qu'ils illustrent
+3. **Navigation complexe** : Difficile de trouver toute la doc d'un domaine
+4. **Pas d'alignement code** : Structure docs â structure `backend/internal/`
+5. **Onboarding difficile** : Nouveau dev doit parcourir 19 fichiers linéairement
+6. **Maintenance** : RĂšgles mĂ©tier, entitĂ©s et diagrammes d'un mĂȘme domaine sont Ă©parpillĂ©s
+
+## đš Architecture cible (DDD)
+
+### Nouvelle structure
+
+```
+docs/
+âââ domains/ # đ Organisation par domaine
+â âââ README.md # Context Map + Index domaines
+â â
+â âââ _shared/ # Core Domain
+â â âââ README.md
+â â âââ rules/
+â â â âââ authentification.md
+â â â âââ rgpd.md
+â â â âââ gestion-erreurs.md
+â â âââ entities/
+â â â âââ modele-global.md
+â â âââ ubiquitous-language.md
+â â
+â âââ recommendation/ # Bounded Context
+â â âââ README.md
+â â âââ rules/
+â â â âââ centres-interet-jauges.md
+â â â âââ algorithme-recommandation.md
+â â â âââ interactions-navigation.md
+â â âââ entities/
+â â â âââ modele-recommandation.md
+â â âââ sequences/
+â â â âââ scoring-recommandation.md
+â â âââ features/
+â â âââ *.feature
+â â
+â âââ content/ # Bounded Context
+â â âââ README.md
+â â âââ rules/
+â â â âââ creation-publication.md
+â â â âââ audio-guides.md
+â â â âââ radio-live.md
+â â â âââ contenus-geolocalises.md
+â â â âââ detection-contenu-protege.md
+â â âââ entities/
+â â â âââ modele-audio-guides.md
+â â â âââ modele-radio-live.md
+â â âââ flows/
+â â
+â âââ advertising/ # Bounded Context
+â â âââ README.md
+â â âââ rules/
+â â â âââ publicites.md
+â â âââ entities/
+â â â âââ modele-publicites.md
+â â âââ sequences/
+â â âââ states/
+â â âââ flows/
+â â
+â âââ premium/ # Bounded Context
+â â âââ README.md
+â â âââ rules/
+â â â âââ premium.md
+â â â âââ mode-offline.md
+â â â âââ abonnements-notifications.md
+â â âââ entities/
+â â â âââ modele-premium.md
+â â âââ sequences/
+â â
+â âââ monetization/ # Bounded Context
+â â âââ README.md
+â â âââ rules/
+â â â âââ monetisation-createurs.md
+â â âââ entities/
+â â â âââ modele-monetisation.md
+â â âââ flows/
+â â
+â âââ moderation/ # Bounded Context
+â âââ README.md
+â âââ rules/
+â â âââ moderation-flows.md
+â â âââ moderation-communautaire.md
+â â âââ autres-comportements.md
+â âââ entities/
+â â âââ modele-moderation.md
+â âââ sequences/
+â â âââ processus-appel-moderation.md
+â âââ states/
+â â âââ signalement-lifecycle.md
+â âââ flows/
+â â âââ moderation-signalement.md
+â âââ features/
+â
+âââ adr/ # InchangĂ©
+âââ legal/ # InchangĂ©
+âââ interfaces/ # InchangĂ©
+âââ technical.md # InchangĂ©
+```
+
+## đ Mapping des domaines
+
+### 7 Bounded Contexts identifiés
+
+| Domaine | RÚgles métier | Entités | Diagrammes | Responsabilité |
+|---------|--------------|---------|------------|----------------|
+| **_shared** | 01, 02, 10 | USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY | - | Authentification, RGPD, Gestion erreurs |
+| **recommendation** | 03, 04, 05 | USER_INTERESTS, INTEREST_CATEGORIES | scoring-recommandation.md | Jauges, Algorithme, Navigation |
+| **content** | 06, 07, 11, 12, 13 | AUDIO_GUIDES, LIVE_STREAMS, GUIDE_SEQUENCES, LIVE_RECORDINGS | - | Création, Audio-guides, Live, Détection droits |
+| **advertising** | 16 | AD_CAMPAIGNS, AD_METRICS, AD_IMPRESSIONS | - | Campagnes, Ciblage, Métriques |
+| **premium** | 08, 09, 17 | PREMIUM_SUBSCRIPTIONS, ACTIVE_STREAMS, OFFLINE_DOWNLOADS | - | Abonnements, Offline, Notifications |
+| **monetization** | 18 | CREATOR_MONETIZATION, REVENUES, PAYOUTS | - | KYC, Revenus, Versements |
+| **moderation** | 14, 15, 19 | REPORTS, SANCTIONS, APPEALS, STRIKES, BADGES | processus-appel-moderation.md, signalement-lifecycle.md, moderation-signalement.md | Signalements, Sanctions, Badges |
+
+## đșïž Plan de migration dĂ©taillĂ©
+
+### Phase 1 : Créer la structure cible
+
+```bash
+# Créer l'arborescence
+mkdir -p docs/domains/{_shared,recommendation,content,advertising,premium,monetization,moderation}/{rules,entities,sequences,states,flows,features}
+```
+
+### Phase 2 : Déplacer les rÚgles métier
+
+| Fichier actuel | Destination |
+|----------------|-------------|
+| `01-authentification-inscription.md` | `domains/_shared/rules/authentification.md` |
+| `02-conformite-rgpd.md` | `domains/_shared/rules/rgpd.md` |
+| `03-centres-interet-jauges.md` | `domains/recommendation/rules/centres-interet-jauges.md` |
+| `04-algorithme-recommandation.md` | `domains/recommendation/rules/algorithme-recommandation.md` |
+| `05-interactions-navigation.md` | `domains/recommendation/rules/interactions-navigation.md` |
+| `06-audio-guides-multi-sequences.md` | `domains/content/rules/audio-guides.md` |
+| `07-contenus-geolocalises-voiture.md` | `domains/content/rules/contenus-geolocalises.md` |
+| `08-mode-offline.md` | `domains/premium/rules/mode-offline.md` |
+| `09-abonnements-notifications.md` | `domains/premium/rules/abonnements-notifications.md` |
+| `10-gestion-erreurs.md` | `domains/_shared/rules/gestion-erreurs.md` |
+| `11-creation-publication-contenu.md` | `domains/content/rules/creation-publication.md` |
+| `12-radio-live.md` | `domains/content/rules/radio-live.md` |
+| `13-detection-contenu-protege.md` | `domains/content/rules/detection-contenu-protege.md` |
+| `14-moderation-flows.md` | `domains/moderation/rules/moderation-flows.md` |
+| `15-moderation-communautaire.md` | `domains/moderation/rules/moderation-communautaire.md` |
+| `16-publicites.md` | `domains/advertising/rules/publicites.md` |
+| `17-premium.md` | `domains/premium/rules/premium.md` |
+| `18-monetisation-createurs.md` | `domains/monetization/rules/monetisation-createurs.md` |
+| `19-autres-comportements.md` | `domains/moderation/rules/autres-comportements.md` |
+| `ANNEXE-POST-MVP.md` | `domains/_shared/rules/ANNEXE-POST-MVP.md` |
+
+### Phase 3 : Déplacer les diagrammes d'entités
+
+| Fichier actuel | Destination |
+|----------------|-------------|
+| `diagrammes/entites/modele-global.md` | `domains/_shared/entities/modele-global.md` |
+| `diagrammes/entites/modele-recommandation.md` | `domains/recommendation/entities/modele-recommandation.md` |
+| `diagrammes/entites/modele-audio-guides.md` | `domains/content/entities/modele-audio-guides.md` |
+| `diagrammes/entites/modele-radio-live.md` | `domains/content/entities/modele-radio-live.md` |
+| `diagrammes/entites/modele-publicites.md` | `domains/advertising/entities/modele-publicites.md` |
+| `diagrammes/entites/modele-premium.md` | `domains/premium/entities/modele-premium.md` |
+| `diagrammes/entites/modele-monetisation.md` | `domains/monetization/entities/modele-monetisation.md` |
+| `diagrammes/entites/modele-moderation.md` | `domains/moderation/entities/modele-moderation.md` |
+
+### Phase 4 : Déplacer les autres diagrammes
+
+| Fichier actuel | Destination |
+|----------------|-------------|
+| `diagrammes/flux/moderation-signalement.md` | `domains/moderation/flows/moderation-signalement.md` |
+| `diagrammes/etats/signalement-lifecycle.md` | `domains/moderation/states/signalement-lifecycle.md` |
+| `diagrammes/sequence/processus-appel-moderation.md` | `domains/moderation/sequences/processus-appel-moderation.md` |
+
+### Phase 5 : Créer les README.md de domaine
+
+Créer un README.md dans chaque domaine avec le template suivant :
+
+```markdown
+# Domaine : [Nom]
+
+## Vue d'ensemble
+[Description du bounded context]
+
+## Responsabilités
+- Responsabilité 1
+- Responsabilité 2
+
+## RÚgles métier
+- [RĂšgle 1](rules/xxx.md)
+
+## ModÚle de données
+- [Diagramme entités](entities/modele-xxx.md)
+
+## Diagrammes
+- [Flux](flows/xxx.md)
+- [Ătats](states/xxx.md)
+- [Séquences](sequences/xxx.md)
+
+## Tests BDD
+- [Feature 1](features/xxx.feature)
+
+## Dépendances
+- â
Dépend de : `_shared`
+- â ïž Interactions avec : `moderation`
+
+## Ubiquitous Language
+**Termes métier spécifiques au domaine**
+```
+
+### Phase 6 : Déplacer les features Gherkin
+
+```bash
+# Les features actuellement dans /features/ root
+mv features/api/recommendation/* domains/recommendation/features/
+mv features/moderation/* domains/moderation/features/
+# etc.
+```
+
+### Phase 7 : Créer le Context Map
+
+Créer `docs/domains/README.md` avec la cartographie des domaines :
+
+```markdown
+# Context Map RoadWave
+
+## Vue d'ensemble des domaines
+
+[Diagramme Mermaid des relations entre bounded contexts]
+
+## Bounded Contexts
+
+### Core Domain
+- **_shared** : Authentification, RGPD, Gestion erreurs
+
+### Supporting Subdomains
+- **recommendation** : Jauges, Algorithme, Scoring
+- **content** : Création, Audio-guides, Live
+- **moderation** : Signalements, Sanctions, Badges
+
+### Generic Subdomains
+- **advertising** : Campagnes publicitaires
+- **premium** : Abonnements, Offline
+- **monetization** : Revenus créateurs
+```
+
+### Phase 8 : Mettre Ă jour mkdocs.yml
+
+Réorganiser la navigation MkDocs pour refléter la nouvelle structure par domaine.
+
+### Phase 9 : Mettre Ă jour les liens internes
+
+Corriger tous les liens relatifs dans les fichiers markdown pour pointer vers les nouvelles locations.
+
+### Phase 10 : Nettoyer l'ancienne structure
+
+```bash
+# Une fois tout migré et testé
+rm -rf docs/regles-metier/
+rm -rf docs/diagrammes/
+```
+
+## â
Avantages attendus
+
+1. **CohĂ©sion forte** : Toute la doc d'un domaine au mĂȘme endroit
+2. **Couplage faible** : Domaines indépendants, dépendances explicites
+3. **Navigabilité améliorée** : README par domaine = entrée claire
+4. **Alignement code/docs** : Miroir de `backend/internal/`
+5. **Onboarding facilité** : Nouveau dev explore domaine par domaine
+6. **Maintenance simplifiée** : Modifier un domaine sans toucher aux autres
+7. **Scalabilité** : Facile d'ajouter un nouveau domaine
+8. **Tests BDD intégrés** : Features au plus prÚs des rÚgles métier
+
+## â ïž Risques et prĂ©cautions
+
+### Risques identifiés
+
+1. **Liens cassés** : Nombreux liens internes à corriger
+2. **Confusion temporaire** : Ăquipe doit s'adapter Ă la nouvelle structure
+3. **MkDocs rebuild** : Navigation complĂšte Ă refaire
+4. **Features Gherkin** : Potentiellement beaucoup de fichiers à déplacer
+
+### Précautions
+
+1. â
**Créer ce plan d'abord** : Validation avant exécution
+2. â
**Branch dédiée** : `refactor/ddd-documentation`
+3. â
**Commits atomiques** : Un commit par phase
+4. â
**Tests continus** : Vérifier MkDocs build aprÚs chaque phase
+5. â
**Backup** : Garder ancienne structure jusqu'Ă validation complĂšte
+6. â
**Script automatisé** : Créer script pour les déplacements et corrections de liens
+
+## đ Checklist d'exĂ©cution
+
+- [ ] Valider ce plan avec l'équipe
+- [ ] Créer branch `refactor/ddd-documentation`
+- [ ] Phase 1 : Créer arborescence
+- [ ] Phase 2 : Déplacer rÚgles métier
+- [ ] Phase 3 : Déplacer diagrammes entités
+- [ ] Phase 4 : Déplacer autres diagrammes
+- [ ] Phase 5 : Créer README.md domaines
+- [ ] Phase 6 : Déplacer features Gherkin
+- [ ] Phase 7 : Créer Context Map
+- [ ] Phase 8 : Mettre Ă jour mkdocs.yml
+- [ ] Phase 9 : Corriger liens internes
+- [ ] Phase 10 : Nettoyer ancienne structure
+- [ ] Tester build MkDocs
+- [ ] Valider avec équipe
+- [ ] Merger dans main
+
+## đ Script d'automatisation suggĂ©rĂ©
+
+```bash
+#!/bin/bash
+# scripts/refactor-ddd.sh
+
+# Phase 1 : Créer structure
+echo "Phase 1: Création structure..."
+mkdir -p docs/domains/{_shared,recommendation,content,advertising,premium,monetization,moderation}/{rules,entities,sequences,states,flows,features}
+
+# Phase 2 : Déplacer rÚgles métier
+echo "Phase 2: Migration rÚgles métier..."
+git mv docs/regles-metier/01-authentification-inscription.md docs/domains/_shared/rules/authentification.md
+# ... etc pour tous les fichiers
+
+# Phase 3-4 : Déplacer diagrammes
+echo "Phase 3-4: Migration diagrammes..."
+git mv docs/diagrammes/entites/modele-global.md docs/domains/_shared/entities/modele-global.md
+# ... etc
+
+# Phase 9 : Corriger liens (sed ou script Python)
+echo "Phase 9: Correction liens..."
+find docs/domains -name "*.md" -exec sed -i 's|../../regles-metier/|../rules/|g' {} \;
+# ... etc
+
+echo "Migration terminée!"
+```
+
+## đ RĂ©fĂ©rences DDD
+
+- [Domain-Driven Design - Eric Evans](https://www.domainlanguage.com/ddd/)
+- [Bounded Context - Martin Fowler](https://martinfowler.com/bliki/BoundedContext.html)
+- [Context Mapping](https://github.com/ddd-crew/context-mapping)
+
+---
+
+**Date de création** : 2026-02-07
+**Statut** : đĄ En attente de validation
+**Auteur** : Documentation refactoring initiative
diff --git a/docs/adr/008-authentification.md b/docs/adr/008-authentification.md
index 3d0ce8a..dc7bad6 100644
--- a/docs/adr/008-authentification.md
+++ b/docs/adr/008-authentification.md
@@ -23,7 +23,7 @@ RoadWave nécessite un systÚme d'authentification sécurisé pour mobile (iOS/A
- Base de données PostgreSQL partagée avec RoadWave (séparation logique par schéma)
- Aucune donnée d'authentification ne transite par des serveurs tiers
-> đ **Clarification** : OAuth2 PKCE est le **protocole technique** utilisĂ© entre l'app mobile et Zitadel. Ce n'est **PAS** pour des fournisseurs tiers. L'authentification reste 100% email/password native (voir [RĂšgle 01](../regles-metier/01-authentification-inscription.md#11-mĂ©thodes-dinscription)).
+> đ **Clarification** : OAuth2 PKCE est le **protocole technique** utilisĂ© entre l'app mobile et Zitadel. Ce n'est **PAS** pour des fournisseurs tiers. L'authentification reste 100% email/password native (voir [RĂšgle 01](../domains/_shared/rules/authentification.md#11-mĂ©thodes-dinscription)).
## Alternatives considérées
@@ -112,7 +112,7 @@ graph TB
- Zitadel implémente OAuth2/OIDC comme **protocole**, mais l'auth reste email/password
- Alternative serait session cookies (moins adapté mobile) ou JWT custom (réinventer la roue)
-> đ **RĂ©fĂ©rence** : Voir [RĂšgle 01 - MĂ©thodes d'Inscription](../regles-metier/01-authentification-inscription.md#11-mĂ©thodes-dinscription) pour la dĂ©cision mĂ©tier.
+> đ **RĂ©fĂ©rence** : Voir [RĂšgle 01 - MĂ©thodes d'Inscription](../domains/_shared/rules/authentification.md#11-mĂ©thodes-dinscription) pour la dĂ©cision mĂ©tier.
## Exemple d'intégration
diff --git a/docs/adr/012-frontend-mobile.md b/docs/adr/012-frontend-mobile.md
index 50289f0..6e32770 100644
--- a/docs/adr/012-frontend-mobile.md
+++ b/docs/adr/012-frontend-mobile.md
@@ -205,8 +205,8 @@ Le service de gestion des permissions (`lib/core/services/location_permission_se
### Documentation Associée
- **Guide détaillé** : [/docs/mobile/permissions-strategy.md](../mobile/permissions-strategy.md)
-- **RÚgles métier** : [RÚgle 05 - Mode Piéton](../regles-metier/05-interactions-navigation.md#512-mode-piéton-audio-guides)
-- **RGPD** : [RÚgle 02 - Conformité RGPD](../regles-metier/02-conformite-rgpd.md)
+- **RÚgles métier** : [RÚgle 05 - Mode Piéton](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides)
+- **RGPD** : [RÚgle 02 - Conformité RGPD](../domains/_shared/rules/rgpd.md)
---
diff --git a/docs/adr/019-geolocalisation-ip.md b/docs/adr/019-geolocalisation-ip.md
index e2d546a..f77113a 100644
--- a/docs/adr/019-geolocalisation-ip.md
+++ b/docs/adr/019-geolocalisation-ip.md
@@ -114,5 +114,5 @@ flowchart TD
- [ADR-004 : CDN (Souveraineté)](004-cdn.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)
+- [RÚgle 02 : RGPD (Mode Dégradé)](../domains/_shared/rules/rgpd.md#136-géolocalisation-optionnelle)
- IP2Location Lite : https://lite.ip2location.com/
diff --git a/docs/adr/023-architecture-moderation.md b/docs/adr/023-architecture-moderation.md
index 9cafc5f..8bcc7bb 100644
--- a/docs/adr/023-architecture-moderation.md
+++ b/docs/adr/023-architecture-moderation.md
@@ -6,7 +6,7 @@
## Contexte
Le systÚme de modération RoadWave doit traiter des signalements de contenu audio problématique (haine, spam, droits d'auteur, etc.) avec :
-- **SLA stricts** : 2h (critique), 24h (haute), 72h (standard) définis dans [RÚgle 14](../regles-metier/14-moderation-flows.md)
+- **SLA stricts** : 2h (critique), 24h (haute), 72h (standard) définis dans [RÚgle 14](../domains/moderation/rules/moderation-flows.md)
- **Scalabilité** : 0-10K+ signalements/mois
- **Conformité DSA** : transparence, traçabilité, délais garantis
- **Efficacité** : pré-filtrage IA pour priorisation automatique
@@ -193,12 +193,12 @@ graph TB
1. Migration Redis Streams si >1000 signalements/jour
2. GPU pour Whisper si latence >15 min P95
3. NLP avancé (distilbert + roberta)
-4. Modération communautaire (badges, [RÚgle 15](../regles-metier/15-moderation-communautaire.md))
+4. Modération communautaire (badges, [RÚgle 15](../domains/moderation/rules/moderation-communautaire.md))
## Références
-- [RÚgle 14 : Modération - Flows opérationnels](../regles-metier/14-moderation-flows.md)
-- [RÚgle 15 : Modération Communautaire](../regles-metier/15-moderation-communautaire.md)
+- [RÚgle 14 : Modération - Flows opérationnels](../domains/moderation/rules/moderation-flows.md)
+- [RÚgle 15 : Modération Communautaire](../domains/moderation/rules/moderation-communautaire.md)
- [ADR-001 : Langage Backend](001-langage-backend.md) (Go, Fiber)
- [ADR-005 : Base de données](005-base-de-donnees.md) (PostgreSQL)
- [ADR-010 : Architecture Backend](010-architecture-backend.md) (Modular monolith)
diff --git a/docs/adr/025-securite-secrets.md b/docs/adr/025-securite-secrets.md
index 0bd995b..56dae06 100644
--- a/docs/adr/025-securite-secrets.md
+++ b/docs/adr/025-securite-secrets.md
@@ -100,7 +100,7 @@ graph TB
### Encryption PII (Field-level)
**Données chiffrées** (AES-256-GCM) :
-- **GPS prĂ©cis** : lat/lon conservĂ©s 24h puis rĂ©duits Ă geohash-5 (~5kmÂČ) ([RĂšgle 02](../regles-metier/02-conformite-rgpd.md))
+- **GPS prĂ©cis** : lat/lon conservĂ©s 24h puis rĂ©duits Ă geohash-5 (~5kmÂČ) ([RĂšgle 02](../domains/_shared/rules/rgpd.md))
- **Email** : chiffré en base, déchiffré uniquement à l'envoi
- **Numéro téléphone** : si ajouté (Phase 2)
@@ -270,7 +270,7 @@ graph TB
- [ADR-011 : AccÚs données](011-orm-acces-donnees.md) (sqlc, prepared statements)
- [ADR-015 : Hébergement](015-hebergement.md) (OVH France, souveraineté)
- [ADR-024 : Monitoring](024-monitoring-observabilite.md) (Audit logs)
-- [RÚgle 02 : Conformité RGPD](../regles-metier/02-conformite-rgpd.md)
+- [RÚgle 02 : Conformité RGPD](../domains/_shared/rules/rgpd.md)
- [HashiCorp Vault Documentation](https://www.vaultproject.io/docs)
- [OWASP Top 10 2021](https://owasp.org/Top10/)
- [NIST SP 800-175B (Cryptography)](https://csrc.nist.gov/publications/detail/sp/800-175b/final)
diff --git a/docs/architecture/sequences/cache-geospatial.md b/docs/architecture/sequences/cache-geospatial.md
index c1abf1a..bd0ae2a 100644
--- a/docs/architecture/sequences/cache-geospatial.md
+++ b/docs/architecture/sequences/cache-geospatial.md
@@ -316,4 +316,5 @@ Score final =
- [ADR-005 : Base de données](../../adr/005-base-de-donnees.md)
- [Redis Geospatial Commands](https://redis.io/docs/data-types/geospatial/)
- [PostGIS Documentation](https://postgis.net/documentation/)
-- [RÚgles métier : Découverte de contenu géolocalisé](../../regles-metier/03-decouverte-contenu.md)
+- [RÚgles métier : Algorithme de recommandation](../../domains/recommendation/rules/algorithme-recommandation.md)
+- [RĂšgles mĂ©tier : Centres d'intĂ©rĂȘt](../../domains/recommendation/rules/centres-interet-jauges.md)
diff --git a/docs/compliance/stores-submission.md b/docs/compliance/stores-submission.md
index 54a1a25..4cc9e17 100644
--- a/docs/compliance/stores-submission.md
+++ b/docs/compliance/stores-submission.md
@@ -84,7 +84,7 @@ RoadWave est une app audio géolocalisée utilisée en conduite (CarPlay/Android
- 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)
+- **Action** : Voir strings détaillés dans [05-interactions-navigation.md](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides)
### Revenus créateurs
diff --git a/docs/domains/README.md b/docs/domains/README.md
new file mode 100644
index 0000000..9aab158
--- /dev/null
+++ b/docs/domains/README.md
@@ -0,0 +1,249 @@
+# Context Map RoadWave
+
+## Vue d'ensemble
+
+RoadWave est organisé selon les principes du **Domain-Driven Design (DDD)** avec **7 bounded contexts** clairs. Cette architecture modulaire permet une meilleure séparation des préoccupations, facilite la maintenance et l'évolution du systÚme.
+
+## Architecture des domaines
+
+```mermaid
+graph TB
+ subgraph "Core Domain"
+ SHARED[_shared
Authentification, RGPD, Erreurs]
+ end
+
+ subgraph "Supporting Subdomains"
+ RECO[recommendation
Jauges & Algorithme]
+ CONTENT[content
Audio-guides & Live]
+ MODERATION[moderation
Signalements & Sanctions]
+ end
+
+ subgraph "Generic Subdomains"
+ ADS[advertising
Publicités]
+ PREMIUM[premium
Abonnements]
+ MONETIZATION[monetization
Monétisation créateurs]
+ end
+
+ %% Dépendances principales
+ RECO --> SHARED
+ RECO --> CONTENT
+ CONTENT --> SHARED
+ ADS --> SHARED
+ ADS --> RECO
+ PREMIUM --> SHARED
+ PREMIUM --> CONTENT
+ MONETIZATION --> SHARED
+ MONETIZATION --> CONTENT
+ MONETIZATION --> ADS
+ MONETIZATION --> PREMIUM
+ MODERATION --> SHARED
+ MODERATION --> CONTENT
+
+ %% Relations anti-corruption
+ ADS -.-|bloqué par| PREMIUM
+ MODERATION -.->|peut démonétiser| MONETIZATION
+```
+
+## Bounded Contexts
+
+### Core Domain
+
+#### đ [_shared](/_shared/)
+**Responsabilité** : Fonctionnalités transversales essentielles
+
+- Authentification et inscription via Zitadel
+- Conformité RGPD (consentements, suppression données)
+- Gestion cohérente des erreurs
+- Entités centrales : `USERS`, `CONTENTS`, `SUBSCRIPTIONS`, `LISTENING_HISTORY`
+
+**Utilisé par** : Tous les autres domaines
+
+---
+
+### Supporting Subdomains
+
+#### đŻ [recommendation](/recommendation/)
+**Responsabilité** : Recommandation géolocalisée de contenus
+
+- Jauges de centres d'intĂ©rĂȘt (scores dynamiques 0-100)
+- Algorithme de scoring (distance + affinité)
+- Adaptation selon interactions utilisateur
+- Entités : `USER_INTERESTS`, `INTEREST_CATEGORIES`
+
+**Dépend de** : `_shared`, `content`
+
+**Ubiquitous Language** : Interest Gauge, Recommendation Score, Geographic Priority, Interest Decay
+
+---
+
+#### đïž [content](/content/)
+**Responsabilité** : Création et diffusion de contenus audio
+
+- Audio-guides multi-séquences géolocalisés
+- Radio live et enregistrements
+- Contenus géolocalisés pour voiture/piéton
+- Détection de contenu protégé (droits d'auteur)
+- Entités : `AUDIO_GUIDES`, `LIVE_STREAMS`, `GUIDE_SEQUENCES`, `LIVE_RECORDINGS`
+
+**Dépend de** : `_shared`
+
+**Interagit avec** : `moderation` (modération), `monetization` (revenus)
+
+**Ubiquitous Language** : Audio Guide, Guide Sequence, Live Stream, Geofence, Content Fingerprint
+
+---
+
+#### đĄïž [moderation](/moderation/)
+**Responsabilité** : Modération et sécurité de la plateforme
+
+- Workflow de traitement des signalements
+- SystĂšme de strikes et sanctions
+- Processus d'appel
+- Badges de confiance créateurs
+- Modération communautaire
+- Entités : `REPORTS`, `SANCTIONS`, `APPEALS`, `STRIKES`, `BADGES`
+
+**Dépend de** : `_shared`, `content`
+
+**Peut affecter** : `monetization` (démonétisation)
+
+**Ubiquitous Language** : Report, Strike, Sanction, Appeal, Trust Badge, Community Moderation
+
+---
+
+### Generic Subdomains
+
+#### đą [advertising](/advertising/)
+**Responsabilité** : Publicités audio géociblées
+
+- Campagnes publicitaires
+- Ciblage gĂ©ographique et par intĂ©rĂȘts
+- Métriques (impressions, CPM)
+- Insertion dynamique dans flux audio
+- Entités : `AD_CAMPAIGNS`, `AD_METRICS`, `AD_IMPRESSIONS`
+
+**Dépend de** : `_shared`, `recommendation` (ciblage)
+
+**Bloqué par** : `premium` (pas de pub pour abonnés)
+
+**Ubiquitous Language** : Ad Campaign, Ad Impression, CPM, Ad Targeting, Skip Rate
+
+---
+
+#### đ [premium](/premium/)
+**Responsabilité** : Abonnements et fonctionnalités premium
+
+- Abonnements payants (mensuel/annuel)
+- Mode offline (téléchargement, synchro)
+- Notifications personnalisées
+- Avantages : sans pub, qualité audio supérieure
+- Entités : `PREMIUM_SUBSCRIPTIONS`, `ACTIVE_STREAMS`, `OFFLINE_DOWNLOADS`
+
+**Dépend de** : `_shared`, `content`
+
+**Bloque** : `advertising` (désactivation pubs)
+
+**Ubiquitous Language** : Premium Subscription, Offline Download, Sync Queue, Premium Tier, Auto-Renewal
+
+---
+
+#### đ° [monetization](/monetization/)
+**Responsabilité** : Monétisation des créateurs
+
+- KYC (vérification identité)
+- Calcul des revenus (pub + abonnements)
+- Versements mensuels via Mangopay
+- Tableaux de bord revenus
+- Entités : `CREATOR_MONETIZATION`, `REVENUES`, `PAYOUTS`
+
+**Dépend de** : `_shared`, `content`, `advertising`, `premium`
+
+**Affecté par** : `moderation` (démonétisation en cas de sanction)
+
+**Ubiquitous Language** : Revenue Share, KYC Verification, Payout, Minimum Threshold
+
+---
+
+## Relations entre domaines
+
+### Upstream/Downstream
+
+| Upstream (Fournisseur) | Downstream (Consommateur) | Type de relation |
+|------------------------|---------------------------|------------------|
+| `_shared` | Tous | **Kernel partagé** |
+| `content` | `recommendation` | **Customer/Supplier** |
+| `recommendation` | `advertising` | **Customer/Supplier** |
+| `premium` | `advertising` | **Anti-Corruption Layer** |
+
+### ĂvĂ©nements de domaine
+
+Les domaines communiquent via des événements métier :
+
+- **UserRegistered** (`_shared` â tous) : Nouvel utilisateur
+- **ContentPublished** (`content` â `recommendation`, `moderation`) : Nouveau contenu
+- **InterestGaugeUpdated** (`recommendation` â `advertising`) : Mise Ă jour jauges
+- **UserBanned** (`moderation` â `monetization`) : Bannissement utilisateur
+- **SubscriptionActivated** (`premium` â `advertising`) : Activation premium
+
+## Structure de la documentation
+
+Chaque domaine suit cette organisation :
+
+```
+domains//
+âââ README.md # Vue d'ensemble du domaine
+âââ rules/ # RĂšgles mĂ©tier (*.md)
+âââ entities/ # Diagrammes entitĂ©s (*.md)
+âââ sequences/ # Diagrammes sĂ©quences (*.md)
+âââ states/ # Diagrammes Ă©tats (*.md)
+âââ flows/ # Diagrammes flux (*.md)
+âââ features/ # Tests BDD Gherkin (*.feature)
+```
+
+## Navigation
+
+- [đ RĂšgles mĂ©tier par numĂ©ro](../regles-metier/) *(structure legacy, dĂ©prĂ©ciĂ©)*
+- [đïž ADR (Architecture Decision Records)](../adr/)
+- [âïž Documentation lĂ©gale](../legal/)
+- [đ„ïž Interfaces UI](../interfaces/)
+- [đ§ Documentation technique](../technical.md)
+
+## Ubiquitous Language Global
+
+**Termes transversaux utilisés dans tous les domaines** :
+
+- **User** : Utilisateur (auditeur, créateur, ou les deux)
+- **Content** : Contenu audio diffusé sur la plateforme
+- **Creator** : Utilisateur créant du contenu
+- **Geolocation** : Position GPS de l'utilisateur
+- **Stream** : Flux de lecture audio
+- **Subscription** : Abonnement (à un créateur ou à premium)
+- **Interest** : Centre d'intĂ©rĂȘt (automobile, voyage, musique, etc.)
+
+## Principes d'architecture
+
+1. **Bounded Contexts clairs** : Chaque domaine a des limites bien définies
+2. **Autonomie des domaines** : Chaque domaine peut évoluer indépendamment
+3. **Communication asynchrone** : Préférence pour les événements vs appels directs
+4. **Anti-Corruption Layer** : Protection contre les changements externes
+5. **Alignment code/docs** : Structure docs â structure `backend/internal/`
+
+## Alignement avec le code backend
+
+```
+backend/internal/ docs/domains/
+âââ auth/ ââ _shared/
+âââ user/ ââ _shared/
+âââ content/ ââ content/
+âââ geo/ ââ recommendation/
+âââ streaming/ ââ content/
+âââ moderation/ ââ moderation/
+âââ payment/ ââ monetization/
+âââ analytics/ ââ recommendation/
+```
+
+---
+
+**DerniĂšre mise Ă jour** : 2026-02-07
+**Statut** : â
Active
+**Auteur** : Documentation DDD initiative
diff --git a/docs/domains/_shared/README.md b/docs/domains/_shared/README.md
new file mode 100644
index 0000000..1ee645e
--- /dev/null
+++ b/docs/domains/_shared/README.md
@@ -0,0 +1,37 @@
+# Domaine : Shared (Core Domain)
+
+## Vue d'ensemble
+
+Le domaine **Shared** constitue le **Core Domain** de RoadWave. Il contient les fonctionnalités transversales essentielles utilisées par tous les autres bounded contexts de l'application.
+
+## Responsabilités
+
+- **Authentification et inscription** : Gestion des comptes utilisateurs, connexion, inscription
+- **Conformité RGPD** : Respect de la vie privée, consentements, suppression des données
+- **Gestion des erreurs** : Traitement cohérent des erreurs à travers toute l'application
+
+## RÚgles métier
+
+- [Authentification et inscription](rules/authentification.md)
+- [Conformité RGPD](rules/rgpd.md)
+- [Gestion des erreurs](rules/gestion-erreurs.md)
+- [Annexe Post-MVP](rules/ANNEXE-POST-MVP.md)
+
+## ModÚle de données
+
+- [Diagramme entités globales](entities/../entities/modele-global.md) - Entités centrales : USERS, CONTENTS, SUBSCRIPTIONS, LISTENING_HISTORY
+
+## Ubiquitous Language
+
+**Termes métier du domaine partagé** :
+- **User** : Utilisateur de la plateforme (auditeur, créateur, ou les deux)
+- **Content** : Tout contenu audio diffusé sur la plateforme
+- **Subscription** : Abonnement d'un utilisateur à un créateur ou une catégorie
+- **Listening History** : Historique d'écoute d'un utilisateur
+- **Authentication** : Processus de vérification de l'identité via Zitadel
+- **RGPD Consent** : Consentement explicite pour le traitement des données personnelles
+
+## Dépendances
+
+- â
Utilisé par : **tous les autres domaines**
+- â ïž DĂ©pend de : aucun (Core Domain)
diff --git a/docs/diagrammes/entites/modele-global.md b/docs/domains/_shared/entities/modele-global.md
similarity index 100%
rename from docs/diagrammes/entites/modele-global.md
rename to docs/domains/_shared/entities/modele-global.md
diff --git a/features/api/authentication/appareil-confiance-2fa.feature b/docs/domains/_shared/features/authentication/appareil-confiance-2fa.feature
similarity index 100%
rename from features/api/authentication/appareil-confiance-2fa.feature
rename to docs/domains/_shared/features/authentication/appareil-confiance-2fa.feature
diff --git a/features/api/authentication/classification-age.feature b/docs/domains/_shared/features/authentication/classification-age.feature
similarity index 100%
rename from features/api/authentication/classification-age.feature
rename to docs/domains/_shared/features/authentication/classification-age.feature
diff --git a/features/api/authentication/connexion.feature b/docs/domains/_shared/features/authentication/connexion.feature
similarity index 100%
rename from features/api/authentication/connexion.feature
rename to docs/domains/_shared/features/authentication/connexion.feature
diff --git a/features/api/authentication/gestion-compte.feature b/docs/domains/_shared/features/authentication/gestion-compte.feature
similarity index 100%
rename from features/api/authentication/gestion-compte.feature
rename to docs/domains/_shared/features/authentication/gestion-compte.feature
diff --git a/features/api/authentication/inscription.feature b/docs/domains/_shared/features/authentication/inscription.feature
similarity index 100%
rename from features/api/authentication/inscription.feature
rename to docs/domains/_shared/features/authentication/inscription.feature
diff --git a/features/api/authentication/limite-tentatives-connexion.feature b/docs/domains/_shared/features/authentication/limite-tentatives-connexion.feature
similarity index 100%
rename from features/api/authentication/limite-tentatives-connexion.feature
rename to docs/domains/_shared/features/authentication/limite-tentatives-connexion.feature
diff --git a/features/api/authentication/multi-device-sessions.feature b/docs/domains/_shared/features/authentication/multi-device-sessions.feature
similarity index 100%
rename from features/api/authentication/multi-device-sessions.feature
rename to docs/domains/_shared/features/authentication/multi-device-sessions.feature
diff --git a/features/api/authentication/recuperation-compte.feature b/docs/domains/_shared/features/authentication/recuperation-compte.feature
similarity index 100%
rename from features/api/authentication/recuperation-compte.feature
rename to docs/domains/_shared/features/authentication/recuperation-compte.feature
diff --git a/features/api/authentication/recuperation-mot-passe-avancee.feature b/docs/domains/_shared/features/authentication/recuperation-mot-passe-avancee.feature
similarity index 100%
rename from features/api/authentication/recuperation-mot-passe-avancee.feature
rename to docs/domains/_shared/features/authentication/recuperation-mot-passe-avancee.feature
diff --git a/features/api/authentication/sessions-tokens.feature b/docs/domains/_shared/features/authentication/sessions-tokens.feature
similarity index 100%
rename from features/api/authentication/sessions-tokens.feature
rename to docs/domains/_shared/features/authentication/sessions-tokens.feature
diff --git a/features/api/authentication/two-factor-authentication.feature b/docs/domains/_shared/features/authentication/two-factor-authentication.feature
similarity index 100%
rename from features/api/authentication/two-factor-authentication.feature
rename to docs/domains/_shared/features/authentication/two-factor-authentication.feature
diff --git a/features/api/authentication/validation-mot-passe.feature b/docs/domains/_shared/features/authentication/validation-mot-passe.feature
similarity index 100%
rename from features/api/authentication/validation-mot-passe.feature
rename to docs/domains/_shared/features/authentication/validation-mot-passe.feature
diff --git a/features/api/authentication/verification-email.feature b/docs/domains/_shared/features/authentication/verification-email.feature
similarity index 100%
rename from features/api/authentication/verification-email.feature
rename to docs/domains/_shared/features/authentication/verification-email.feature
diff --git a/features/e2e/error-handling/aucun-contenu-disponible.feature b/docs/domains/_shared/features/error-handling/aucun-contenu-disponible.feature
similarity index 100%
rename from features/e2e/error-handling/aucun-contenu-disponible.feature
rename to docs/domains/_shared/features/error-handling/aucun-contenu-disponible.feature
diff --git a/features/e2e/error-handling/contenu-supprime-pendant-ecoute.feature b/docs/domains/_shared/features/error-handling/contenu-supprime-pendant-ecoute.feature
similarity index 100%
rename from features/e2e/error-handling/contenu-supprime-pendant-ecoute.feature
rename to docs/domains/_shared/features/error-handling/contenu-supprime-pendant-ecoute.feature
diff --git a/features/e2e/error-handling/geolocalisation-desactivee.feature b/docs/domains/_shared/features/error-handling/geolocalisation-desactivee.feature
similarity index 100%
rename from features/e2e/error-handling/geolocalisation-desactivee.feature
rename to docs/domains/_shared/features/error-handling/geolocalisation-desactivee.feature
diff --git a/features/e2e/error-handling/perte-reseau.feature b/docs/domains/_shared/features/error-handling/perte-reseau.feature
similarity index 100%
rename from features/e2e/error-handling/perte-reseau.feature
rename to docs/domains/_shared/features/error-handling/perte-reseau.feature
diff --git a/features/ui/partage/partage-contenu-premium.feature b/docs/domains/_shared/features/partage/partage-contenu-premium.feature
similarity index 100%
rename from features/ui/partage/partage-contenu-premium.feature
rename to docs/domains/_shared/features/partage/partage-contenu-premium.feature
diff --git a/features/ui/partage/partage-contenu.feature b/docs/domains/_shared/features/partage/partage-contenu.feature
similarity index 100%
rename from features/ui/partage/partage-contenu.feature
rename to docs/domains/_shared/features/partage/partage-contenu.feature
diff --git a/features/api/profil/badge-verifie.feature b/docs/domains/_shared/features/profil/badge-verifie.feature
similarity index 100%
rename from features/api/profil/badge-verifie.feature
rename to docs/domains/_shared/features/profil/badge-verifie.feature
diff --git a/features/ui/profil/profil-createur.feature b/docs/domains/_shared/features/profil/profil-createur.feature
similarity index 100%
rename from features/ui/profil/profil-createur.feature
rename to docs/domains/_shared/features/profil/profil-createur.feature
diff --git a/features/ui/profil/statistiques-arrondies.feature b/docs/domains/_shared/features/profil/statistiques-arrondies.feature
similarity index 100%
rename from features/ui/profil/statistiques-arrondies.feature
rename to docs/domains/_shared/features/profil/statistiques-arrondies.feature
diff --git a/features/api/rgpd-compliance/anonymisation-gps.feature b/docs/domains/_shared/features/rgpd-compliance/anonymisation-gps.feature
similarity index 100%
rename from features/api/rgpd-compliance/anonymisation-gps.feature
rename to docs/domains/_shared/features/rgpd-compliance/anonymisation-gps.feature
diff --git a/features/api/rgpd-compliance/compliance-administrative.feature b/docs/domains/_shared/features/rgpd-compliance/compliance-administrative.feature
similarity index 100%
rename from features/api/rgpd-compliance/compliance-administrative.feature
rename to docs/domains/_shared/features/rgpd-compliance/compliance-administrative.feature
diff --git a/features/api/rgpd-compliance/consentement.feature b/docs/domains/_shared/features/rgpd-compliance/consentement.feature
similarity index 100%
rename from features/api/rgpd-compliance/consentement.feature
rename to docs/domains/_shared/features/rgpd-compliance/consentement.feature
diff --git a/features/api/rgpd-compliance/conservation-donnees.feature b/docs/domains/_shared/features/rgpd-compliance/conservation-donnees.feature
similarity index 100%
rename from features/api/rgpd-compliance/conservation-donnees.feature
rename to docs/domains/_shared/features/rgpd-compliance/conservation-donnees.feature
diff --git a/features/api/rgpd-compliance/cookies-analytics.feature b/docs/domains/_shared/features/rgpd-compliance/cookies-analytics.feature
similarity index 100%
rename from features/api/rgpd-compliance/cookies-analytics.feature
rename to docs/domains/_shared/features/rgpd-compliance/cookies-analytics.feature
diff --git a/features/api/rgpd-compliance/mode-degrade-geoip.feature b/docs/domains/_shared/features/rgpd-compliance/mode-degrade-geoip.feature
similarity index 100%
rename from features/api/rgpd-compliance/mode-degrade-geoip.feature
rename to docs/domains/_shared/features/rgpd-compliance/mode-degrade-geoip.feature
diff --git a/features/api/rgpd-compliance/portabilite-donnees.feature b/docs/domains/_shared/features/rgpd-compliance/portabilite-donnees.feature
similarity index 100%
rename from features/api/rgpd-compliance/portabilite-donnees.feature
rename to docs/domains/_shared/features/rgpd-compliance/portabilite-donnees.feature
diff --git a/features/api/rgpd-compliance/suppression-compte.feature b/docs/domains/_shared/features/rgpd-compliance/suppression-compte.feature
similarity index 100%
rename from features/api/rgpd-compliance/suppression-compte.feature
rename to docs/domains/_shared/features/rgpd-compliance/suppression-compte.feature
diff --git a/docs/regles-metier/ANNEXE-POST-MVP.md b/docs/domains/_shared/rules/ANNEXE-POST-MVP.md
similarity index 100%
rename from docs/regles-metier/ANNEXE-POST-MVP.md
rename to docs/domains/_shared/rules/ANNEXE-POST-MVP.md
diff --git a/docs/regles-metier/01-authentification-inscription.md b/docs/domains/_shared/rules/authentification.md
similarity index 100%
rename from docs/regles-metier/01-authentification-inscription.md
rename to docs/domains/_shared/rules/authentification.md
diff --git a/docs/regles-metier/10-gestion-erreurs.md b/docs/domains/_shared/rules/gestion-erreurs.md
similarity index 100%
rename from docs/regles-metier/10-gestion-erreurs.md
rename to docs/domains/_shared/rules/gestion-erreurs.md
diff --git a/docs/regles-metier/02-conformite-rgpd.md b/docs/domains/_shared/rules/rgpd.md
similarity index 100%
rename from docs/regles-metier/02-conformite-rgpd.md
rename to docs/domains/_shared/rules/rgpd.md
diff --git a/docs/domains/advertising/README.md b/docs/domains/advertising/README.md
new file mode 100644
index 0000000..f82b462
--- /dev/null
+++ b/docs/domains/advertising/README.md
@@ -0,0 +1,36 @@
+# Domaine : Advertising
+
+## Vue d'ensemble
+
+Le domaine **Advertising** gÚre la diffusion de publicités audio ciblées. C'est un **Generic Subdomain** qui constitue une source de revenus importante pour la plateforme.
+
+## Responsabilités
+
+- **Campagnes publicitaires** : Création et gestion des campagnes
+- **Ciblage** : Ciblage gĂ©ographique et par centres d'intĂ©rĂȘt
+- **Métriques** : Suivi des impressions, écoutes et performances
+- **Insertion dynamique** : Insertion de publicités dans les flux audio
+
+## RÚgles métier
+
+- [Publicités](rules/publicites.md)
+
+## ModÚle de données
+
+- [Diagramme entités publicités](entities/modele-publicites.md) - Entités : AD_CAMPAIGNS, AD_METRICS, AD_IMPRESSIONS
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Ad Campaign** : Campagne publicitaire avec budget et durée
+- **Ad Impression** : Affichage/lecture d'une publicité
+- **Ad Targeting** : CritĂšres de ciblage (geo + intĂ©rĂȘts)
+- **CPM (Cost Per Mille)** : Coût pour 1000 impressions
+- **Ad Insertion** : Insertion dynamique dans le flux audio
+- **Skip Rate** : Taux de publicités sautées par les utilisateurs
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users, listening history)
+- â
DĂ©pend de : `recommendation` (ciblage par intĂ©rĂȘts)
+- â ïž BloquĂ© par : `premium` (pas de pub pour abonnĂ©s premium)
diff --git a/docs/diagrammes/entites/modele-publicites.md b/docs/domains/advertising/entities/modele-publicites.md
similarity index 94%
rename from docs/diagrammes/entites/modele-publicites.md
rename to docs/domains/advertising/entities/modele-publicites.md
index b007196..dbf30cd 100644
--- a/docs/diagrammes/entites/modele-publicites.md
+++ b/docs/domains/advertising/entities/modele-publicites.md
@@ -1,6 +1,6 @@
# ModÚle de données - Publicités
-đ Voir [RĂšgles mĂ©tier - Section 16 : PublicitĂ©s](../../regles-metier/16-publicites.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 16 : PublicitĂ©s](../rules/publicites.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/api/publicites/campagnes-publicitaires.feature b/docs/domains/advertising/features/publicites/campagnes-publicitaires.feature
similarity index 100%
rename from features/api/publicites/campagnes-publicitaires.feature
rename to docs/domains/advertising/features/publicites/campagnes-publicitaires.feature
diff --git a/features/api/publicites/caracteristiques-pub.feature b/docs/domains/advertising/features/publicites/caracteristiques-pub.feature
similarity index 100%
rename from features/api/publicites/caracteristiques-pub.feature
rename to docs/domains/advertising/features/publicites/caracteristiques-pub.feature
diff --git a/features/api/publicites/ciblage-horaire-fuseaux-horaires.feature b/docs/domains/advertising/features/publicites/ciblage-horaire-fuseaux-horaires.feature
similarity index 100%
rename from features/api/publicites/ciblage-horaire-fuseaux-horaires.feature
rename to docs/domains/advertising/features/publicites/ciblage-horaire-fuseaux-horaires.feature
diff --git a/features/api/publicites/gestion-budget-pub.feature b/docs/domains/advertising/features/publicites/gestion-budget-pub.feature
similarity index 100%
rename from features/api/publicites/gestion-budget-pub.feature
rename to docs/domains/advertising/features/publicites/gestion-budget-pub.feature
diff --git a/features/api/publicites/insertion-frequence-pub.feature b/docs/domains/advertising/features/publicites/insertion-frequence-pub.feature
similarity index 100%
rename from features/api/publicites/insertion-frequence-pub.feature
rename to docs/domains/advertising/features/publicites/insertion-frequence-pub.feature
diff --git a/features/api/publicites/metriques-engagement-pub.feature b/docs/domains/advertising/features/publicites/metriques-engagement-pub.feature
similarity index 100%
rename from features/api/publicites/metriques-engagement-pub.feature
rename to docs/domains/advertising/features/publicites/metriques-engagement-pub.feature
diff --git a/features/api/publicites/validation-moderation-pub.feature b/docs/domains/advertising/features/publicites/validation-moderation-pub.feature
similarity index 100%
rename from features/api/publicites/validation-moderation-pub.feature
rename to docs/domains/advertising/features/publicites/validation-moderation-pub.feature
diff --git a/docs/regles-metier/16-publicites.md b/docs/domains/advertising/rules/publicites.md
similarity index 100%
rename from docs/regles-metier/16-publicites.md
rename to docs/domains/advertising/rules/publicites.md
diff --git a/docs/domains/content/README.md b/docs/domains/content/README.md
new file mode 100644
index 0000000..dd8f0a5
--- /dev/null
+++ b/docs/domains/content/README.md
@@ -0,0 +1,44 @@
+# Domaine : Content
+
+## Vue d'ensemble
+
+Le domaine **Content** gÚre toute la création, publication et diffusion des contenus audio sur RoadWave. C'est un **Supporting Subdomain** essentiel qui couvre les audio-guides, les radios live et les contenus géolocalisés.
+
+## Responsabilités
+
+- **Création et publication** : Workflow de création de contenu par les créateurs
+- **Audio-guides multi-séquences** : Gestion des parcours audio structurés
+- **Radio live** : Diffusion en direct et enregistrements
+- **Contenus géolocalisés** : Association de contenus à des zones géographiques
+- **Détection de contenu protégé** : Prévention des violations de droits d'auteur
+
+## RÚgles métier
+
+- [Création et publication de contenu](rules/creation-publication.md)
+- [Audio-guides multi-séquences](rules/audio-guides.md)
+- [Radio live](rules/radio-live.md)
+- [Contenus géolocalisés en voiture](rules/contenus-geolocalises.md)
+- [Détection de contenu protégé](rules/detection-contenu-protege.md)
+
+## ModÚle de données
+
+- [Diagramme entités audio-guides](entities/modele-audio-guides.md) - Entités : AUDIO_GUIDES, GUIDE_SEQUENCES
+- [Diagramme entités radio live](entities/modele-radio-live.md) - Entités : LIVE_STREAMS, LIVE_RECORDINGS
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Audio Guide** : Contenu structuré en séquences géolocalisées
+- **Guide Sequence** : Segment d'un audio-guide déclenché à un point GPS précis
+- **Live Stream** : Diffusion audio en temps réel
+- **Live Recording** : Enregistrement automatique d'un live pour réécoute
+- **Geofence** : Zone géographique déclenchant un contenu
+- **Content Fingerprint** : Empreinte numérique pour détecter le contenu protégé
+- **Creator** : Utilisateur créant et publiant du contenu
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users, contents base)
+- â ïž Interactions avec : `moderation` (modĂ©ration de contenu)
+- â ïž Interactions avec : `monetization` (revenus crĂ©ateurs)
+- â ïž UtilisĂ© par : `recommendation` (mĂ©tadonnĂ©es pour scoring)
diff --git a/docs/diagrammes/entites/modele-audio-guides.md b/docs/domains/content/entities/modele-audio-guides.md
similarity index 96%
rename from docs/diagrammes/entites/modele-audio-guides.md
rename to docs/domains/content/entities/modele-audio-guides.md
index caf0761..8132eca 100644
--- a/docs/diagrammes/entites/modele-audio-guides.md
+++ b/docs/domains/content/entities/modele-audio-guides.md
@@ -1,6 +1,6 @@
# ModÚle de données - Audio-guides
-đ Voir [RĂšgles mĂ©tier - Section 06 : Audio-guides multi-sĂ©quences](../../regles-metier/06-audio-guides-multi-sequences.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 06 : Audio-guides multi-sĂ©quences](../rules/audio-guides.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/docs/diagrammes/entites/modele-radio-live.md b/docs/domains/content/entities/modele-radio-live.md
similarity index 94%
rename from docs/diagrammes/entites/modele-radio-live.md
rename to docs/domains/content/entities/modele-radio-live.md
index aefeff5..5a0dca1 100644
--- a/docs/diagrammes/entites/modele-radio-live.md
+++ b/docs/domains/content/entities/modele-radio-live.md
@@ -1,6 +1,6 @@
# ModÚle de données - Radio Live
-đ Voir [RĂšgles mĂ©tier - Section 12 : Radio Live](../../regles-metier/12-radio-live.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 12 : Radio Live](../rules/radio-live.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/api/audio-guides/affichage-distance-direction-eta.feature b/docs/domains/content/features/audio-guides/affichage-distance-direction-eta.feature
similarity index 100%
rename from features/api/audio-guides/affichage-distance-direction-eta.feature
rename to docs/domains/content/features/audio-guides/affichage-distance-direction-eta.feature
diff --git a/features/ui/audio-guides/creation-audio-guide.feature b/docs/domains/content/features/audio-guides/creation-audio-guide.feature
similarity index 100%
rename from features/ui/audio-guides/creation-audio-guide.feature
rename to docs/domains/content/features/audio-guides/creation-audio-guide.feature
diff --git a/features/api/audio-guides/creation-gestion.feature b/docs/domains/content/features/audio-guides/creation-gestion.feature
similarity index 100%
rename from features/api/audio-guides/creation-gestion.feature
rename to docs/domains/content/features/audio-guides/creation-gestion.feature
diff --git a/features/api/audio-guides/creation-wizard-complet.feature b/docs/domains/content/features/audio-guides/creation-wizard-complet.feature
similarity index 100%
rename from features/api/audio-guides/creation-wizard-complet.feature
rename to docs/domains/content/features/audio-guides/creation-wizard-complet.feature
diff --git a/features/api/audio-guides/declenchement-gps-voiture-complet.feature b/docs/domains/content/features/audio-guides/declenchement-gps-voiture-complet.feature
similarity index 100%
rename from features/api/audio-guides/declenchement-gps-voiture-complet.feature
rename to docs/domains/content/features/audio-guides/declenchement-gps-voiture-complet.feature
diff --git a/features/api/audio-guides/declenchement-gps.feature b/docs/domains/content/features/audio-guides/declenchement-gps.feature
similarity index 100%
rename from features/api/audio-guides/declenchement-gps.feature
rename to docs/domains/content/features/audio-guides/declenchement-gps.feature
diff --git a/features/api/audio-guides/detection-mode-deplacement.feature b/docs/domains/content/features/audio-guides/detection-mode-deplacement.feature
similarity index 100%
rename from features/api/audio-guides/detection-mode-deplacement.feature
rename to docs/domains/content/features/audio-guides/detection-mode-deplacement.feature
diff --git a/features/api/audio-guides/gestion-point-manque.feature b/docs/domains/content/features/audio-guides/gestion-point-manque.feature
similarity index 100%
rename from features/api/audio-guides/gestion-point-manque.feature
rename to docs/domains/content/features/audio-guides/gestion-point-manque.feature
diff --git a/features/ui/audio-guides/integration-fonctionnalites.feature b/docs/domains/content/features/audio-guides/integration-fonctionnalites.feature
similarity index 100%
rename from features/ui/audio-guides/integration-fonctionnalites.feature
rename to docs/domains/content/features/audio-guides/integration-fonctionnalites.feature
diff --git a/features/api/audio-guides/metriques-analytics.feature b/docs/domains/content/features/audio-guides/metriques-analytics.feature
similarity index 100%
rename from features/api/audio-guides/metriques-analytics.feature
rename to docs/domains/content/features/audio-guides/metriques-analytics.feature
diff --git a/features/ui/audio-guides/mode-pieton.feature b/docs/domains/content/features/audio-guides/mode-pieton.feature
similarity index 100%
rename from features/ui/audio-guides/mode-pieton.feature
rename to docs/domains/content/features/audio-guides/mode-pieton.feature
diff --git a/features/ui/audio-guides/mode-voiture.feature b/docs/domains/content/features/audio-guides/mode-voiture.feature
similarity index 100%
rename from features/ui/audio-guides/mode-voiture.feature
rename to docs/domains/content/features/audio-guides/mode-voiture.feature
diff --git a/features/api/audio-guides/modes-velo-transport-complet.feature b/docs/domains/content/features/audio-guides/modes-velo-transport-complet.feature
similarity index 100%
rename from features/api/audio-guides/modes-velo-transport-complet.feature
rename to docs/domains/content/features/audio-guides/modes-velo-transport-complet.feature
diff --git a/features/ui/audio-guides/modes-velo-transport.feature b/docs/domains/content/features/audio-guides/modes-velo-transport.feature
similarity index 100%
rename from features/ui/audio-guides/modes-velo-transport.feature
rename to docs/domains/content/features/audio-guides/modes-velo-transport.feature
diff --git a/features/ui/audio-guides/navigation-libre-pieton-complet.feature b/docs/domains/content/features/audio-guides/navigation-libre-pieton-complet.feature
similarity index 100%
rename from features/ui/audio-guides/navigation-libre-pieton-complet.feature
rename to docs/domains/content/features/audio-guides/navigation-libre-pieton-complet.feature
diff --git a/features/api/audio-guides/pieton-pub-autoplay.feature b/docs/domains/content/features/audio-guides/pieton-pub-autoplay.feature
similarity index 100%
rename from features/api/audio-guides/pieton-pub-autoplay.feature
rename to docs/domains/content/features/audio-guides/pieton-pub-autoplay.feature
diff --git a/features/ui/audio-guides/premium-monetisation.feature b/docs/domains/content/features/audio-guides/premium-monetisation.feature
similarity index 100%
rename from features/ui/audio-guides/premium-monetisation.feature
rename to docs/domains/content/features/audio-guides/premium-monetisation.feature
diff --git a/features/ui/audio-guides/progression-sauvegarde.feature b/docs/domains/content/features/audio-guides/progression-sauvegarde.feature
similarity index 100%
rename from features/ui/audio-guides/progression-sauvegarde.feature
rename to docs/domains/content/features/audio-guides/progression-sauvegarde.feature
diff --git a/features/api/audio-guides/progression-sync.feature b/docs/domains/content/features/audio-guides/progression-sync.feature
similarity index 100%
rename from features/api/audio-guides/progression-sync.feature
rename to docs/domains/content/features/audio-guides/progression-sync.feature
diff --git a/features/api/audio-guides/publicites-complet.feature b/docs/domains/content/features/audio-guides/publicites-complet.feature
similarity index 100%
rename from features/api/audio-guides/publicites-complet.feature
rename to docs/domains/content/features/audio-guides/publicites-complet.feature
diff --git a/features/api/audio-guides/publicites.feature b/docs/domains/content/features/audio-guides/publicites.feature
similarity index 100%
rename from features/api/audio-guides/publicites.feature
rename to docs/domains/content/features/audio-guides/publicites.feature
diff --git a/features/api/audio-guides/rayon-configurable-createur.feature b/docs/domains/content/features/audio-guides/rayon-configurable-createur.feature
similarity index 100%
rename from features/api/audio-guides/rayon-configurable-createur.feature
rename to docs/domains/content/features/audio-guides/rayon-configurable-createur.feature
diff --git a/features/api/audio-guides/reprise-progression-complet.feature b/docs/domains/content/features/audio-guides/reprise-progression-complet.feature
similarity index 100%
rename from features/api/audio-guides/reprise-progression-complet.feature
rename to docs/domains/content/features/audio-guides/reprise-progression-complet.feature
diff --git a/features/api/audio-guides/sauvegarde-sync-progression.feature b/docs/domains/content/features/audio-guides/sauvegarde-sync-progression.feature
similarity index 100%
rename from features/api/audio-guides/sauvegarde-sync-progression.feature
rename to docs/domains/content/features/audio-guides/sauvegarde-sync-progression.feature
diff --git a/features/ui/audio-guides/systeme-double-clic-sortie.feature b/docs/domains/content/features/audio-guides/systeme-double-clic-sortie.feature
similarity index 100%
rename from features/ui/audio-guides/systeme-double-clic-sortie.feature
rename to docs/domains/content/features/audio-guides/systeme-double-clic-sortie.feature
diff --git a/features/api/content-creation/fair-use-30s-musique.feature b/docs/domains/content/features/content-creation/fair-use-30s-musique.feature
similarity index 100%
rename from features/api/content-creation/fair-use-30s-musique.feature
rename to docs/domains/content/features/content-creation/fair-use-30s-musique.feature
diff --git a/features/api/content-creation/image-couverture-auto.feature b/docs/domains/content/features/content-creation/image-couverture-auto.feature
similarity index 100%
rename from features/api/content-creation/image-couverture-auto.feature
rename to docs/domains/content/features/content-creation/image-couverture-auto.feature
diff --git a/features/api/content-creation/metadonnees-publication.feature b/docs/domains/content/features/content-creation/metadonnees-publication.feature
similarity index 100%
rename from features/api/content-creation/metadonnees-publication.feature
rename to docs/domains/content/features/content-creation/metadonnees-publication.feature
diff --git a/features/api/content-creation/modification-suppression.feature b/docs/domains/content/features/content-creation/modification-suppression.feature
similarity index 100%
rename from features/api/content-creation/modification-suppression.feature
rename to docs/domains/content/features/content-creation/modification-suppression.feature
diff --git a/features/api/content-creation/restrictions-modification.feature b/docs/domains/content/features/content-creation/restrictions-modification.feature
similarity index 100%
rename from features/api/content-creation/restrictions-modification.feature
rename to docs/domains/content/features/content-creation/restrictions-modification.feature
diff --git a/features/api/content-creation/suppression-marquage.feature b/docs/domains/content/features/content-creation/suppression-marquage.feature
similarity index 100%
rename from features/api/content-creation/suppression-marquage.feature
rename to docs/domains/content/features/content-creation/suppression-marquage.feature
diff --git a/features/api/content-creation/upload-encodage.feature b/docs/domains/content/features/content-creation/upload-encodage.feature
similarity index 100%
rename from features/api/content-creation/upload-encodage.feature
rename to docs/domains/content/features/content-creation/upload-encodage.feature
diff --git a/features/api/content-creation/validation-musique-detection.feature b/docs/domains/content/features/content-creation/validation-musique-detection.feature
similarity index 100%
rename from features/api/content-creation/validation-musique-detection.feature
rename to docs/domains/content/features/content-creation/validation-musique-detection.feature
diff --git a/features/api/content-creation/validation-premiers-contenus.feature b/docs/domains/content/features/content-creation/validation-premiers-contenus.feature
similarity index 100%
rename from features/api/content-creation/validation-premiers-contenus.feature
rename to docs/domains/content/features/content-creation/validation-premiers-contenus.feature
diff --git a/features/api/navigation/auto-switching-modes.feature b/docs/domains/content/features/navigation/auto-switching-modes.feature
similarity index 100%
rename from features/api/navigation/auto-switching-modes.feature
rename to docs/domains/content/features/navigation/auto-switching-modes.feature
diff --git a/features/api/navigation/decompte-5s-transition.feature b/docs/domains/content/features/navigation/decompte-5s-transition.feature
similarity index 100%
rename from features/api/navigation/decompte-5s-transition.feature
rename to docs/domains/content/features/navigation/decompte-5s-transition.feature
diff --git a/features/api/navigation/eta-calculation.feature b/docs/domains/content/features/navigation/eta-calculation.feature
similarity index 100%
rename from features/api/navigation/eta-calculation.feature
rename to docs/domains/content/features/navigation/eta-calculation.feature
diff --git a/features/api/navigation/file-attente.feature b/docs/domains/content/features/navigation/file-attente.feature
similarity index 100%
rename from features/api/navigation/file-attente.feature
rename to docs/domains/content/features/navigation/file-attente.feature
diff --git a/features/api/navigation/historique-geo-contenu.feature b/docs/domains/content/features/navigation/historique-geo-contenu.feature
similarity index 100%
rename from features/api/navigation/historique-geo-contenu.feature
rename to docs/domains/content/features/navigation/historique-geo-contenu.feature
diff --git a/features/api/navigation/mode-stationnement.feature b/docs/domains/content/features/navigation/mode-stationnement.feature
similarity index 100%
rename from features/api/navigation/mode-stationnement.feature
rename to docs/domains/content/features/navigation/mode-stationnement.feature
diff --git a/features/api/navigation/notification-minimaliste-voiture.feature b/docs/domains/content/features/navigation/notification-minimaliste-voiture.feature
similarity index 100%
rename from features/api/navigation/notification-minimaliste-voiture.feature
rename to docs/domains/content/features/navigation/notification-minimaliste-voiture.feature
diff --git a/features/api/navigation/notifications-geolocalisees.feature b/docs/domains/content/features/navigation/notifications-geolocalisees.feature
similarity index 100%
rename from features/api/navigation/notifications-geolocalisees.feature
rename to docs/domains/content/features/navigation/notifications-geolocalisees.feature
diff --git a/features/api/navigation/quota-cooldown.feature b/docs/domains/content/features/navigation/quota-cooldown.feature
similarity index 100%
rename from features/api/navigation/quota-cooldown.feature
rename to docs/domains/content/features/navigation/quota-cooldown.feature
diff --git a/features/api/radio-live/architecture-technique-live.feature b/docs/domains/content/features/radio-live/architecture-technique-live.feature
similarity index 100%
rename from features/api/radio-live/architecture-technique-live.feature
rename to docs/domains/content/features/radio-live/architecture-technique-live.feature
diff --git a/features/api/radio-live/arret-live.feature b/docs/domains/content/features/radio-live/arret-live.feature
similarity index 100%
rename from features/api/radio-live/arret-live.feature
rename to docs/domains/content/features/radio-live/arret-live.feature
diff --git a/features/api/radio-live/comportement-auditeur-live.feature b/docs/domains/content/features/radio-live/comportement-auditeur-live.feature
similarity index 100%
rename from features/api/radio-live/comportement-auditeur-live.feature
rename to docs/domains/content/features/radio-live/comportement-auditeur-live.feature
diff --git a/features/api/radio-live/comportement-auditeur.feature b/docs/domains/content/features/radio-live/comportement-auditeur.feature
similarity index 100%
rename from features/api/radio-live/comportement-auditeur.feature
rename to docs/domains/content/features/radio-live/comportement-auditeur.feature
diff --git a/features/api/radio-live/demarrage-live.feature b/docs/domains/content/features/radio-live/demarrage-live.feature
similarity index 100%
rename from features/api/radio-live/demarrage-live.feature
rename to docs/domains/content/features/radio-live/demarrage-live.feature
diff --git a/features/api/radio-live/enregistrement-publication-replay.feature b/docs/domains/content/features/radio-live/enregistrement-publication-replay.feature
similarity index 100%
rename from features/api/radio-live/enregistrement-publication-replay.feature
rename to docs/domains/content/features/radio-live/enregistrement-publication-replay.feature
diff --git a/features/api/radio-live/interdictions-moderation-live.feature b/docs/domains/content/features/radio-live/interdictions-moderation-live.feature
similarity index 100%
rename from features/api/radio-live/interdictions-moderation-live.feature
rename to docs/domains/content/features/radio-live/interdictions-moderation-live.feature
diff --git a/features/ui/content-creation/education-droits-auteur.feature b/docs/domains/content/features/ui-content-creation/education-droits-auteur.feature
similarity index 100%
rename from features/ui/content-creation/education-droits-auteur.feature
rename to docs/domains/content/features/ui-content-creation/education-droits-auteur.feature
diff --git a/features/ui/navigation/actions-mode-pieton.feature b/docs/domains/content/features/ui-navigation/actions-mode-pieton.feature
similarity index 100%
rename from features/ui/navigation/actions-mode-pieton.feature
rename to docs/domains/content/features/ui-navigation/actions-mode-pieton.feature
diff --git a/features/ui/navigation/commande-precedent.feature b/docs/domains/content/features/ui-navigation/commande-precedent.feature
similarity index 100%
rename from features/ui/navigation/commande-precedent.feature
rename to docs/domains/content/features/ui-navigation/commande-precedent.feature
diff --git a/features/ui/navigation/commandes-vocales.feature b/docs/domains/content/features/ui-navigation/commandes-vocales.feature
similarity index 100%
rename from features/ui/navigation/commandes-vocales.feature
rename to docs/domains/content/features/ui-navigation/commandes-vocales.feature
diff --git a/features/ui/navigation/commandes-volant.feature b/docs/domains/content/features/ui-navigation/commandes-volant.feature
similarity index 100%
rename from features/ui/navigation/commandes-volant.feature
rename to docs/domains/content/features/ui-navigation/commandes-volant.feature
diff --git a/features/ui/navigation/contenus-geolocalises-voiture.feature b/docs/domains/content/features/ui-navigation/contenus-geolocalises-voiture.feature
similarity index 100%
rename from features/ui/navigation/contenus-geolocalises-voiture.feature
rename to docs/domains/content/features/ui-navigation/contenus-geolocalises-voiture.feature
diff --git a/features/ui/navigation/file-attente-suivant.feature b/docs/domains/content/features/ui-navigation/file-attente-suivant.feature
similarity index 100%
rename from features/ui/navigation/file-attente-suivant.feature
rename to docs/domains/content/features/ui-navigation/file-attente-suivant.feature
diff --git a/features/ui/navigation/lecture-enchainement.feature b/docs/domains/content/features/ui-navigation/lecture-enchainement.feature
similarity index 100%
rename from features/ui/navigation/lecture-enchainement.feature
rename to docs/domains/content/features/ui-navigation/lecture-enchainement.feature
diff --git a/features/ui/navigation/mode-pieton-notifications-push.feature b/docs/domains/content/features/ui-navigation/mode-pieton-notifications-push.feature
similarity index 100%
rename from features/ui/navigation/mode-pieton-notifications-push.feature
rename to docs/domains/content/features/ui-navigation/mode-pieton-notifications-push.feature
diff --git a/docs/regles-metier/06-audio-guides-multi-sequences.md b/docs/domains/content/rules/audio-guides.md
similarity index 100%
rename from docs/regles-metier/06-audio-guides-multi-sequences.md
rename to docs/domains/content/rules/audio-guides.md
diff --git a/docs/regles-metier/07-contenus-geolocalises-voiture.md b/docs/domains/content/rules/contenus-geolocalises.md
similarity index 100%
rename from docs/regles-metier/07-contenus-geolocalises-voiture.md
rename to docs/domains/content/rules/contenus-geolocalises.md
diff --git a/docs/regles-metier/11-creation-publication-contenu.md b/docs/domains/content/rules/creation-publication.md
similarity index 100%
rename from docs/regles-metier/11-creation-publication-contenu.md
rename to docs/domains/content/rules/creation-publication.md
diff --git a/docs/regles-metier/13-detection-contenu-protege.md b/docs/domains/content/rules/detection-contenu-protege.md
similarity index 100%
rename from docs/regles-metier/13-detection-contenu-protege.md
rename to docs/domains/content/rules/detection-contenu-protege.md
diff --git a/docs/regles-metier/12-radio-live.md b/docs/domains/content/rules/radio-live.md
similarity index 100%
rename from docs/regles-metier/12-radio-live.md
rename to docs/domains/content/rules/radio-live.md
diff --git a/docs/domains/moderation/README.md b/docs/domains/moderation/README.md
new file mode 100644
index 0000000..dda49a0
--- /dev/null
+++ b/docs/domains/moderation/README.md
@@ -0,0 +1,51 @@
+# Domaine : Moderation
+
+## Vue d'ensemble
+
+Le domaine **Moderation** gÚre la modération des contenus et des utilisateurs, les signalements, les sanctions et le systÚme de badges de confiance. C'est un **Supporting Subdomain** critique pour la qualité et la sécurité de la plateforme.
+
+## Responsabilités
+
+- **Signalements** : Workflow de traitement des signalements utilisateurs
+- **Sanctions** : SystĂšme de strikes et bannissements
+- **Appels** : Processus de contestation des sanctions
+- **Badges de confiance** : Attribution de badges aux créateurs fiables
+- **Modération communautaire** : Implication des utilisateurs dans la modération
+
+## RÚgles métier
+
+- [Moderation flows](rules/moderation-flows.md) - Workflows de modération
+- [Modération communautaire](rules/moderation-communautaire.md)
+- [Autres comportements](rules/autres-comportements.md) - Comportements sanctionnables
+
+## ModÚle de données
+
+- [Diagramme entités modération](entities/modele-moderation.md) - Entités : REPORTS, SANCTIONS, APPEALS, STRIKES, BADGES
+
+## Diagrammes
+
+- [Flux : Modération et signalement](flows/moderation-signalement.md)
+- [Ătats : Lifecycle d'un signalement](states/signalement-lifecycle.md)
+- [Séquence : Processus d'appel](sequences/processus-appel-moderation.md)
+
+## Tests BDD
+
+- Features de modération *(voir Phase 6)*
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Report** : Signalement d'un contenu ou utilisateur problématique
+- **Strike** : Avertissement comptabilisé (3 strikes = ban)
+- **Sanction** : Mesure disciplinaire (warning, suspension, ban)
+- **Appeal** : Contestation d'une sanction par l'utilisateur
+- **Trust Badge** : Badge de confiance attribué aux créateurs fiables
+- **Community Moderation** : Modération participative par les utilisateurs
+- **Moderator** : Utilisateur avec droits de modération
+- **Auto-Moderation** : Modération automatique (IA, filtres)
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users, contents)
+- â ïž Interactions avec : `content` (modĂ©ration de contenus)
+- â ïž Interactions avec : `monetization` (dĂ©monĂ©tisation en cas de sanction)
diff --git a/docs/diagrammes/entites/modele-moderation.md b/docs/domains/moderation/entities/modele-moderation.md
similarity index 97%
rename from docs/diagrammes/entites/modele-moderation.md
rename to docs/domains/moderation/entities/modele-moderation.md
index bdeeca9..c4bbb90 100644
--- a/docs/diagrammes/entites/modele-moderation.md
+++ b/docs/domains/moderation/entities/modele-moderation.md
@@ -1,6 +1,6 @@
# ModÚle de données - Modération
-đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../../regles-metier/14-moderation-flows.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../rules/moderation-flows.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/admin/moderation/dashboard-moderateur.feature b/docs/domains/moderation/features/admin/dashboard-moderateur.feature
similarity index 100%
rename from features/admin/moderation/dashboard-moderateur.feature
rename to docs/domains/moderation/features/admin/dashboard-moderateur.feature
diff --git a/features/admin/moderation/outils-moderateur.feature b/docs/domains/moderation/features/admin/outils-moderateur.feature
similarity index 100%
rename from features/admin/moderation/outils-moderateur.feature
rename to docs/domains/moderation/features/admin/outils-moderateur.feature
diff --git a/features/api/moderation/appel-droits-auteur.feature b/docs/domains/moderation/features/api/appel-droits-auteur.feature
similarity index 100%
rename from features/api/moderation/appel-droits-auteur.feature
rename to docs/domains/moderation/features/api/appel-droits-auteur.feature
diff --git a/features/api/moderation/audit-trimestriel.feature b/docs/domains/moderation/features/api/audit-trimestriel.feature
similarity index 100%
rename from features/api/moderation/audit-trimestriel.feature
rename to docs/domains/moderation/features/api/audit-trimestriel.feature
diff --git a/features/api/moderation/badges-system.feature b/docs/domains/moderation/features/api/badges-system.feature
similarity index 100%
rename from features/api/moderation/badges-system.feature
rename to docs/domains/moderation/features/api/badges-system.feature
diff --git a/features/api/moderation/detection-patterns-suspects.feature b/docs/domains/moderation/features/api/detection-patterns-suspects.feature
similarity index 100%
rename from features/api/moderation/detection-patterns-suspects.feature
rename to docs/domains/moderation/features/api/detection-patterns-suspects.feature
diff --git a/features/api/moderation/limite-temporelle-anti-abus.feature b/docs/domains/moderation/features/api/limite-temporelle-anti-abus.feature
similarity index 100%
rename from features/api/moderation/limite-temporelle-anti-abus.feature
rename to docs/domains/moderation/features/api/limite-temporelle-anti-abus.feature
diff --git a/features/api/moderation/moderation-communautaire.feature b/docs/domains/moderation/features/api/moderation-communautaire.feature
similarity index 100%
rename from features/api/moderation/moderation-communautaire.feature
rename to docs/domains/moderation/features/api/moderation-communautaire.feature
diff --git a/features/api/moderation/moderation-preventive.feature b/docs/domains/moderation/features/api/moderation-preventive.feature
similarity index 100%
rename from features/api/moderation/moderation-preventive.feature
rename to docs/domains/moderation/features/api/moderation-preventive.feature
diff --git a/features/api/moderation/reduction-premium-badge-or.feature b/docs/domains/moderation/features/api/reduction-premium-badge-or.feature
similarity index 100%
rename from features/api/moderation/reduction-premium-badge-or.feature
rename to docs/domains/moderation/features/api/reduction-premium-badge-or.feature
diff --git a/features/api/moderation/sanctions-abus-progressives.feature b/docs/domains/moderation/features/api/sanctions-abus-progressives.feature
similarity index 100%
rename from features/api/moderation/sanctions-abus-progressives.feature
rename to docs/domains/moderation/features/api/sanctions-abus-progressives.feature
diff --git a/features/api/moderation/sanctions-droits-auteur.feature b/docs/domains/moderation/features/api/sanctions-droits-auteur.feature
similarity index 100%
rename from features/api/moderation/sanctions-droits-auteur.feature
rename to docs/domains/moderation/features/api/sanctions-droits-auteur.feature
diff --git a/features/api/moderation/sanctions-notifications.feature b/docs/domains/moderation/features/api/sanctions-notifications.feature
similarity index 100%
rename from features/api/moderation/sanctions-notifications.feature
rename to docs/domains/moderation/features/api/sanctions-notifications.feature
diff --git a/features/api/moderation/score-fiabilite-priorisation.feature b/docs/domains/moderation/features/api/score-fiabilite-priorisation.feature
similarity index 100%
rename from features/api/moderation/score-fiabilite-priorisation.feature
rename to docs/domains/moderation/features/api/score-fiabilite-priorisation.feature
diff --git a/features/api/moderation/signalement-musique-posteriori.feature b/docs/domains/moderation/features/api/signalement-musique-posteriori.feature
similarity index 100%
rename from features/api/moderation/signalement-musique-posteriori.feature
rename to docs/domains/moderation/features/api/signalement-musique-posteriori.feature
diff --git a/features/api/moderation/signalement.feature b/docs/domains/moderation/features/api/signalement.feature
similarity index 100%
rename from features/api/moderation/signalement.feature
rename to docs/domains/moderation/features/api/signalement.feature
diff --git a/features/api/moderation/traitement-signalements.feature b/docs/domains/moderation/features/api/traitement-signalements.feature
similarity index 100%
rename from features/api/moderation/traitement-signalements.feature
rename to docs/domains/moderation/features/api/traitement-signalements.feature
diff --git a/features/api/moderation/utilisateur-confiance.feature b/docs/domains/moderation/features/api/utilisateur-confiance.feature
similarity index 100%
rename from features/api/moderation/utilisateur-confiance.feature
rename to docs/domains/moderation/features/api/utilisateur-confiance.feature
diff --git a/features/ui/moderation/badges-statistiques.feature b/docs/domains/moderation/features/ui/badges-statistiques.feature
similarity index 100%
rename from features/ui/moderation/badges-statistiques.feature
rename to docs/domains/moderation/features/ui/badges-statistiques.feature
diff --git a/features/ui/moderation/historique-signalements.feature b/docs/domains/moderation/features/ui/historique-signalements.feature
similarity index 100%
rename from features/ui/moderation/historique-signalements.feature
rename to docs/domains/moderation/features/ui/historique-signalements.feature
diff --git a/features/ui/moderation/modal-decouverte-badges.feature b/docs/domains/moderation/features/ui/modal-decouverte-badges.feature
similarity index 100%
rename from features/ui/moderation/modal-decouverte-badges.feature
rename to docs/domains/moderation/features/ui/modal-decouverte-badges.feature
diff --git a/features/ui/moderation/sanctions-appel.feature b/docs/domains/moderation/features/ui/sanctions-appel.feature
similarity index 100%
rename from features/ui/moderation/sanctions-appel.feature
rename to docs/domains/moderation/features/ui/sanctions-appel.feature
diff --git a/features/ui/moderation/signalement-ui.feature b/docs/domains/moderation/features/ui/signalement-ui.feature
similarity index 100%
rename from features/ui/moderation/signalement-ui.feature
rename to docs/domains/moderation/features/ui/signalement-ui.feature
diff --git a/docs/diagrammes/flux/moderation-signalement.md b/docs/domains/moderation/flows/moderation-signalement.md
similarity index 98%
rename from docs/diagrammes/flux/moderation-signalement.md
rename to docs/domains/moderation/flows/moderation-signalement.md
index 32f04bc..5a6765a 100644
--- a/docs/diagrammes/flux/moderation-signalement.md
+++ b/docs/domains/moderation/flows/moderation-signalement.md
@@ -1,6 +1,6 @@
# Flux de modération - Processus de signalement
-đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../../regles-metier/14-moderation-flows.md)
+đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../rules/moderation-flows.md)
## Diagramme
diff --git a/docs/regles-metier/19-autres-comportements.md b/docs/domains/moderation/rules/autres-comportements.md
similarity index 100%
rename from docs/regles-metier/19-autres-comportements.md
rename to docs/domains/moderation/rules/autres-comportements.md
diff --git a/docs/regles-metier/15-moderation-communautaire.md b/docs/domains/moderation/rules/moderation-communautaire.md
similarity index 100%
rename from docs/regles-metier/15-moderation-communautaire.md
rename to docs/domains/moderation/rules/moderation-communautaire.md
diff --git a/docs/regles-metier/14-moderation-flows.md b/docs/domains/moderation/rules/moderation-flows.md
similarity index 100%
rename from docs/regles-metier/14-moderation-flows.md
rename to docs/domains/moderation/rules/moderation-flows.md
diff --git a/docs/diagrammes/sequence/processus-appel-moderation.md b/docs/domains/moderation/sequences/processus-appel-moderation.md
similarity index 97%
rename from docs/diagrammes/sequence/processus-appel-moderation.md
rename to docs/domains/moderation/sequences/processus-appel-moderation.md
index 23fc4ef..d9e8144 100644
--- a/docs/diagrammes/sequence/processus-appel-moderation.md
+++ b/docs/domains/moderation/sequences/processus-appel-moderation.md
@@ -1,6 +1,6 @@
# Processus d'appel de modération
-đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../../regles-metier/14-moderation-flows.md)
+đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../rules/moderation-flows.md)
## Diagramme
diff --git a/docs/diagrammes/etats/signalement-lifecycle.md b/docs/domains/moderation/states/signalement-lifecycle.md
similarity index 98%
rename from docs/diagrammes/etats/signalement-lifecycle.md
rename to docs/domains/moderation/states/signalement-lifecycle.md
index c74c943..49711c0 100644
--- a/docs/diagrammes/etats/signalement-lifecycle.md
+++ b/docs/domains/moderation/states/signalement-lifecycle.md
@@ -1,6 +1,6 @@
# Cycle de vie d'un signalement
-đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../../regles-metier/14-moderation-flows.md)
+đ Voir [RĂšgles mĂ©tier - Section 14 : ModĂ©ration Flows](../rules/moderation-flows.md)
## Diagramme
diff --git a/docs/domains/monetization/README.md b/docs/domains/monetization/README.md
new file mode 100644
index 0000000..bfacbf0
--- /dev/null
+++ b/docs/domains/monetization/README.md
@@ -0,0 +1,38 @@
+# Domaine : Monetization
+
+## Vue d'ensemble
+
+Le domaine **Monetization** gÚre la monétisation des créateurs de contenu via les revenus publicitaires et les abonnements. C'est un **Generic Subdomain** qui implémente le modÚle de partage de revenus.
+
+## Responsabilités
+
+- **KYC (Know Your Customer)** : Vérification d'identité des créateurs
+- **Calcul des revenus** : Agrégation des revenus par source (pub, abonnements)
+- **Versements** : Paiements mensuels via Mangopay
+- **Tableaux de bord** : Analytics de revenus pour créateurs
+
+## RÚgles métier
+
+- [Monétisation des créateurs](rules/monetisation-createurs.md)
+
+## ModÚle de données
+
+- [Diagramme entités monétisation](entities/modele-monetisation.md) - Entités : CREATOR_MONETIZATION, REVENUES, PAYOUTS
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Creator Monetization** : Activation de la monétisation pour un créateur
+- **KYC Verification** : Vérification d'identité requise pour versements
+- **Revenue Share** : Partage de revenus (70% créateur / 30% plateforme)
+- **Payout** : Versement mensuel des revenus
+- **Minimum Threshold** : Seuil minimum de revenus pour déclencher un versement
+- **Revenue Source** : Source de revenu (ads, premium subscriptions)
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users en tant que créateurs)
+- â
Dépend de : `content` (contenus monétisés)
+- â
Dépend de : `advertising` (revenus publicitaires)
+- â
Dépend de : `premium` (revenus abonnements)
+- â ïž Interactions avec : systĂšme de paiement Mangopay (externe)
diff --git a/docs/diagrammes/entites/modele-monetisation.md b/docs/domains/monetization/entities/modele-monetisation.md
similarity index 94%
rename from docs/diagrammes/entites/modele-monetisation.md
rename to docs/domains/monetization/entities/modele-monetisation.md
index 4fa30ea..2e66105 100644
--- a/docs/diagrammes/entites/modele-monetisation.md
+++ b/docs/domains/monetization/entities/modele-monetisation.md
@@ -1,6 +1,6 @@
# ModÚle de données - Monétisation créateurs
-đ Voir [RĂšgles mĂ©tier - Section 18 : MonĂ©tisation](../../regles-metier/18-monetisation-createurs.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 18 : MonĂ©tisation](../rules/monetisation-createurs.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/api/monetisation/conditions-activation.feature b/docs/domains/monetization/features/monetisation/conditions-activation.feature
similarity index 100%
rename from features/api/monetisation/conditions-activation.feature
rename to docs/domains/monetization/features/monetisation/conditions-activation.feature
diff --git a/features/api/monetisation/contenus-premium-exclusifs.feature b/docs/domains/monetization/features/monetisation/contenus-premium-exclusifs.feature
similarity index 100%
rename from features/api/monetisation/contenus-premium-exclusifs.feature
rename to docs/domains/monetization/features/monetisation/contenus-premium-exclusifs.feature
diff --git a/features/api/monetisation/desactivation-suspension.feature b/docs/domains/monetization/features/monetisation/desactivation-suspension.feature
similarity index 100%
rename from features/api/monetisation/desactivation-suspension.feature
rename to docs/domains/monetization/features/monetisation/desactivation-suspension.feature
diff --git a/features/api/monetisation/kyc-inscription.feature b/docs/domains/monetization/features/monetisation/kyc-inscription.feature
similarity index 100%
rename from features/api/monetisation/kyc-inscription.feature
rename to docs/domains/monetization/features/monetisation/kyc-inscription.feature
diff --git a/features/api/monetisation/obligations-fiscales.feature b/docs/domains/monetization/features/monetisation/obligations-fiscales.feature
similarity index 100%
rename from features/api/monetisation/obligations-fiscales.feature
rename to docs/domains/monetization/features/monetisation/obligations-fiscales.feature
diff --git a/features/api/monetisation/paiement-createurs.feature b/docs/domains/monetization/features/monetisation/paiement-createurs.feature
similarity index 100%
rename from features/api/monetisation/paiement-createurs.feature
rename to docs/domains/monetization/features/monetisation/paiement-createurs.feature
diff --git a/features/api/monetisation/soldes-dormants-inactifs.feature b/docs/domains/monetization/features/monetisation/soldes-dormants-inactifs.feature
similarity index 100%
rename from features/api/monetisation/soldes-dormants-inactifs.feature
rename to docs/domains/monetization/features/monetisation/soldes-dormants-inactifs.feature
diff --git a/features/api/monetisation/sources-revenus.feature b/docs/domains/monetization/features/monetisation/sources-revenus.feature
similarity index 100%
rename from features/api/monetisation/sources-revenus.feature
rename to docs/domains/monetization/features/monetisation/sources-revenus.feature
diff --git a/docs/regles-metier/18-monetisation-createurs.md b/docs/domains/monetization/rules/monetisation-createurs.md
similarity index 100%
rename from docs/regles-metier/18-monetisation-createurs.md
rename to docs/domains/monetization/rules/monetisation-createurs.md
diff --git a/docs/domains/premium/README.md b/docs/domains/premium/README.md
new file mode 100644
index 0000000..321d074
--- /dev/null
+++ b/docs/domains/premium/README.md
@@ -0,0 +1,38 @@
+# Domaine : Premium
+
+## Vue d'ensemble
+
+Le domaine **Premium** gÚre les abonnements payants et les fonctionnalités exclusives pour les utilisateurs premium. C'est un **Generic Subdomain** essentiel au modÚle économique freemium.
+
+## Responsabilités
+
+- **Abonnements** : Gestion des souscriptions et renouvellements
+- **Mode offline** : Téléchargement et synchronisation de contenus
+- **Notifications** : Alertes personnalisées pour abonnés
+- **Avantages premium** : AccÚs aux fonctionnalités exclusives (sans pub, qualité audio supérieure, etc.)
+
+## RÚgles métier
+
+- [Premium](rules/premium.md) - Fonctionnalités et avantages
+- [Mode offline](rules/mode-offline.md) - Téléchargement et synchronisation
+- [Abonnements et notifications](rules/abonnements-notifications.md)
+
+## ModÚle de données
+
+- [Diagramme entités premium](entities/modele-premium.md) - Entités : PREMIUM_SUBSCRIPTIONS, ACTIVE_STREAMS, OFFLINE_DOWNLOADS
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Premium Subscription** : Abonnement payant mensuel ou annuel
+- **Offline Download** : Téléchargement pour écoute hors-ligne
+- **Sync Queue** : File d'attente de synchronisation offline
+- **Premium Tier** : Niveau d'abonnement (Basic, Plus, Family)
+- **Auto-Renewal** : Renouvellement automatique de l'abonnement
+- **Premium Notification** : Notification personnalisée pour abonnés
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users, subscriptions)
+- â ïž Interactions avec : `advertising` (dĂ©sactivation des pubs)
+- â ïž Interactions avec : `content` (tĂ©lĂ©chargement de contenus)
diff --git a/docs/diagrammes/entites/modele-premium.md b/docs/domains/premium/entities/modele-premium.md
similarity index 94%
rename from docs/diagrammes/entites/modele-premium.md
rename to docs/domains/premium/entities/modele-premium.md
index a72abb6..a212b55 100644
--- a/docs/diagrammes/entites/modele-premium.md
+++ b/docs/domains/premium/entities/modele-premium.md
@@ -1,6 +1,6 @@
# ModÚle de données - Premium
-đ Voir [RĂšgles mĂ©tier - Section 17 : Premium](../../regles-metier/17-premium.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 17 : Premium](../rules/premium.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/e2e/abonnements/audio-guides-pieton.feature b/docs/domains/premium/features/abonnements/audio-guides-pieton.feature
similarity index 100%
rename from features/e2e/abonnements/audio-guides-pieton.feature
rename to docs/domains/premium/features/abonnements/audio-guides-pieton.feature
diff --git a/features/e2e/abonnements/impact-algorithme.feature b/docs/domains/premium/features/abonnements/impact-algorithme.feature
similarity index 100%
rename from features/e2e/abonnements/impact-algorithme.feature
rename to docs/domains/premium/features/abonnements/impact-algorithme.feature
diff --git a/features/e2e/abonnements/limites-desabonnement.feature b/docs/domains/premium/features/abonnements/limites-desabonnement.feature
similarity index 100%
rename from features/e2e/abonnements/limites-desabonnement.feature
rename to docs/domains/premium/features/abonnements/limites-desabonnement.feature
diff --git a/features/e2e/abonnements/notifications-contextuelles.feature b/docs/domains/premium/features/abonnements/notifications-contextuelles.feature
similarity index 100%
rename from features/e2e/abonnements/notifications-contextuelles.feature
rename to docs/domains/premium/features/abonnements/notifications-contextuelles.feature
diff --git a/features/ui/mode-offline/contenus-supprimes-pendant-offline.feature b/docs/domains/premium/features/mode-offline/contenus-supprimes-pendant-offline.feature
similarity index 100%
rename from features/ui/mode-offline/contenus-supprimes-pendant-offline.feature
rename to docs/domains/premium/features/mode-offline/contenus-supprimes-pendant-offline.feature
diff --git a/features/ui/mode-offline/synchronisation-actions.feature b/docs/domains/premium/features/mode-offline/synchronisation-actions.feature
similarity index 100%
rename from features/ui/mode-offline/synchronisation-actions.feature
rename to docs/domains/premium/features/mode-offline/synchronisation-actions.feature
diff --git a/features/ui/mode-offline/telechargement.feature b/docs/domains/premium/features/mode-offline/telechargement.feature
similarity index 100%
rename from features/ui/mode-offline/telechargement.feature
rename to docs/domains/premium/features/mode-offline/telechargement.feature
diff --git a/features/ui/mode-offline/validite-renouvellement.feature b/docs/domains/premium/features/mode-offline/validite-renouvellement.feature
similarity index 100%
rename from features/ui/mode-offline/validite-renouvellement.feature
rename to docs/domains/premium/features/mode-offline/validite-renouvellement.feature
diff --git a/features/api/premium/avantages-premium.feature b/docs/domains/premium/features/premium/avantages-premium.feature
similarity index 100%
rename from features/api/premium/avantages-premium.feature
rename to docs/domains/premium/features/premium/avantages-premium.feature
diff --git a/features/api/premium/gestion-abonnement.feature b/docs/domains/premium/features/premium/gestion-abonnement.feature
similarity index 100%
rename from features/api/premium/gestion-abonnement.feature
rename to docs/domains/premium/features/premium/gestion-abonnement.feature
diff --git a/features/api/premium/multi-devices-dernier-priorite.feature b/docs/domains/premium/features/premium/multi-devices-dernier-priorite.feature
similarity index 100%
rename from features/api/premium/multi-devices-dernier-priorite.feature
rename to docs/domains/premium/features/premium/multi-devices-dernier-priorite.feature
diff --git a/features/api/premium/multi-devices-detection.feature b/docs/domains/premium/features/premium/multi-devices-detection.feature
similarity index 100%
rename from features/api/premium/multi-devices-detection.feature
rename to docs/domains/premium/features/premium/multi-devices-detection.feature
diff --git a/features/api/premium/offre-tarification.feature b/docs/domains/premium/features/premium/offre-tarification.feature
similarity index 100%
rename from features/api/premium/offre-tarification.feature
rename to docs/domains/premium/features/premium/offre-tarification.feature
diff --git a/features/api/premium/stream-conflict-detection.feature b/docs/domains/premium/features/premium/stream-conflict-detection.feature
similarity index 100%
rename from features/api/premium/stream-conflict-detection.feature
rename to docs/domains/premium/features/premium/stream-conflict-detection.feature
diff --git a/features/api/premium/tarification-multi-canal.feature b/docs/domains/premium/features/premium/tarification-multi-canal.feature
similarity index 100%
rename from features/api/premium/tarification-multi-canal.feature
rename to docs/domains/premium/features/premium/tarification-multi-canal.feature
diff --git a/features/api/premium/webhooks-retry-paiement.feature b/docs/domains/premium/features/premium/webhooks-retry-paiement.feature
similarity index 100%
rename from features/api/premium/webhooks-retry-paiement.feature
rename to docs/domains/premium/features/premium/webhooks-retry-paiement.feature
diff --git a/docs/regles-metier/09-abonnements-notifications.md b/docs/domains/premium/rules/abonnements-notifications.md
similarity index 100%
rename from docs/regles-metier/09-abonnements-notifications.md
rename to docs/domains/premium/rules/abonnements-notifications.md
diff --git a/docs/regles-metier/08-mode-offline.md b/docs/domains/premium/rules/mode-offline.md
similarity index 100%
rename from docs/regles-metier/08-mode-offline.md
rename to docs/domains/premium/rules/mode-offline.md
diff --git a/docs/regles-metier/17-premium.md b/docs/domains/premium/rules/premium.md
similarity index 100%
rename from docs/regles-metier/17-premium.md
rename to docs/domains/premium/rules/premium.md
diff --git a/docs/domains/recommendation/README.md b/docs/domains/recommendation/README.md
new file mode 100644
index 0000000..61955e4
--- /dev/null
+++ b/docs/domains/recommendation/README.md
@@ -0,0 +1,45 @@
+# Domaine : Recommendation
+
+## Vue d'ensemble
+
+Le domaine **Recommendation** gĂšre le systĂšme de recommandation de contenus basĂ© sur la gĂ©olocalisation et les centres d'intĂ©rĂȘt des utilisateurs. C'est un **Supporting Subdomain** clĂ© qui diffĂ©rencie RoadWave des autres plateformes audio.
+
+## Responsabilités
+
+- **Jauges de centres d'intĂ©rĂȘt** : Gestion et Ă©volution dynamique des prĂ©fĂ©rences utilisateurs
+- **Algorithme de recommandation** : Scoring et classement des contenus pertinents
+- **Interactions et navigation** : Adaptation des recommandations selon le comportement utilisateur
+
+## RÚgles métier
+
+- [Centres d'intĂ©rĂȘt et jauges](rules/centres-interet-jauges.md)
+- [Algorithme de recommandation](rules/algorithme-recommandation.md)
+- [Interactions et navigation](rules/interactions-navigation.md)
+
+## ModÚle de données
+
+- [Diagramme entités recommandation](entities/modele-recommandation.md) - Entités : USER_INTERESTS, INTEREST_CATEGORIES
+
+## Diagrammes
+
+- [Séquence : Scoring et recommandation](sequences/scoring-recommandation.md) *(à créer si existant)*
+
+## Tests BDD
+
+- Features de recommandation *(voir Phase 6)*
+
+## Ubiquitous Language
+
+**Termes métier du domaine** :
+- **Interest Gauge** : Jauge de centre d'intĂ©rĂȘt (score de 0 Ă 100)
+- **Interest Category** : CatĂ©gorie d'intĂ©rĂȘt (automobile, voyage, musique, etc.)
+- **Recommendation Score** : Score combinant distance gĂ©ographique et affinitĂ© d'intĂ©rĂȘt
+- **Content Scoring** : Algorithme de calcul du score de pertinence
+- **Geographic Priority** : Priorisation GPS > Ville > Département > Région > Pays
+- **Interest Decay** : Diminution progressive de la jauge sans interaction
+
+## Dépendances
+
+- â
Dépend de : `_shared` (users, contents)
+- â
Dépend de : `content` (métadonnées de contenus)
+- â ïž UtilisĂ© par : interface mobile, API publique
diff --git a/docs/diagrammes/entites/modele-recommandation.md b/docs/domains/recommendation/entities/modele-recommandation.md
similarity index 92%
rename from docs/diagrammes/entites/modele-recommandation.md
rename to docs/domains/recommendation/entities/modele-recommandation.md
index 18a1a02..503f4ea 100644
--- a/docs/diagrammes/entites/modele-recommandation.md
+++ b/docs/domains/recommendation/entities/modele-recommandation.md
@@ -1,6 +1,6 @@
# ModÚle de données - Recommandation
-đ Voir [RĂšgles mĂ©tier - Section 03 : Centres d'intĂ©rĂȘt](../../regles-metier/03-centres-interet-jauges.md) | [Section 04 : Algorithme](../../regles-metier/04-algorithme-recommandation.md) | [EntitĂ©s globales](modele-global.md)
+đ Voir [RĂšgles mĂ©tier - Section 03 : Centres d'intĂ©rĂȘt](../rules/centres-interet-jauges.md) | [Section 04 : Algorithme](../rules/algorithme-recommandation.md) | [EntitĂ©s globales](../../_shared/entities/modele-global.md)
## Diagramme
diff --git a/features/api/interest-gauges/degradation-temporelle.feature b/docs/domains/recommendation/features/interest-gauges/degradation-temporelle.feature
similarity index 100%
rename from features/api/interest-gauges/degradation-temporelle.feature
rename to docs/domains/recommendation/features/interest-gauges/degradation-temporelle.feature
diff --git a/features/api/interest-gauges/evolution-jauges.feature b/docs/domains/recommendation/features/interest-gauges/evolution-jauges.feature
similarity index 100%
rename from features/api/interest-gauges/evolution-jauges.feature
rename to docs/domains/recommendation/features/interest-gauges/evolution-jauges.feature
diff --git a/features/api/interest-gauges/jauge-initiale.feature b/docs/domains/recommendation/features/interest-gauges/jauge-initiale.feature
similarity index 100%
rename from features/api/interest-gauges/jauge-initiale.feature
rename to docs/domains/recommendation/features/interest-gauges/jauge-initiale.feature
diff --git a/features/api/interest-gauges/skip-abonnes-neutralisation.feature b/docs/domains/recommendation/features/interest-gauges/skip-abonnes-neutralisation.feature
similarity index 100%
rename from features/api/interest-gauges/skip-abonnes-neutralisation.feature
rename to docs/domains/recommendation/features/interest-gauges/skip-abonnes-neutralisation.feature
diff --git a/features/ui/recherche/filtres-avances.feature b/docs/domains/recommendation/features/recherche/filtres-avances.feature
similarity index 100%
rename from features/ui/recherche/filtres-avances.feature
rename to docs/domains/recommendation/features/recherche/filtres-avances.feature
diff --git a/features/ui/recherche/page-resultats-carte.feature b/docs/domains/recommendation/features/recherche/page-resultats-carte.feature
similarity index 100%
rename from features/ui/recherche/page-resultats-carte.feature
rename to docs/domains/recommendation/features/recherche/page-resultats-carte.feature
diff --git a/features/ui/recherche/recherche.feature b/docs/domains/recommendation/features/recherche/recherche.feature
similarity index 100%
rename from features/ui/recherche/recherche.feature
rename to docs/domains/recommendation/features/recherche/recherche.feature
diff --git a/features/api/recommendation/README.md b/docs/domains/recommendation/features/recommendation/README.md
similarity index 98%
rename from features/api/recommendation/README.md
rename to docs/domains/recommendation/features/recommendation/README.md
index 296f4e5..7cd25f2 100644
--- a/features/api/recommendation/README.md
+++ b/docs/domains/recommendation/features/recommendation/README.md
@@ -1,6 +1,6 @@
# Tests Gherkin - Algorithme de Recommandation
-Tests BDD pour la section [04-algorithme-recommandation.md](../../docs/regles-metier/04-algorithme-recommandation.md)
+Tests BDD pour la section [04-algorithme-recommandation.md](../rules/algorithme-recommandation.md)
## Fichiers de tests
diff --git a/features/api/recommendation/classification-geo.feature b/docs/domains/recommendation/features/recommendation/classification-geo.feature
similarity index 100%
rename from features/api/recommendation/classification-geo.feature
rename to docs/domains/recommendation/features/recommendation/classification-geo.feature
diff --git a/features/api/recommendation/contenu-politique.feature b/docs/domains/recommendation/features/recommendation/contenu-politique.feature
similarity index 100%
rename from features/api/recommendation/contenu-politique.feature
rename to docs/domains/recommendation/features/recommendation/contenu-politique.feature
diff --git a/features/api/recommendation/declenchement-geo.feature b/docs/domains/recommendation/features/recommendation/declenchement-geo.feature
similarity index 100%
rename from features/api/recommendation/declenchement-geo.feature
rename to docs/domains/recommendation/features/recommendation/declenchement-geo.feature
diff --git a/features/api/recommendation/historique-reproposition.feature b/docs/domains/recommendation/features/recommendation/historique-reproposition.feature
similarity index 100%
rename from features/api/recommendation/historique-reproposition.feature
rename to docs/domains/recommendation/features/recommendation/historique-reproposition.feature
diff --git a/features/api/recommendation/medias-traditionnels.feature b/docs/domains/recommendation/features/recommendation/medias-traditionnels.feature
similarity index 100%
rename from features/api/recommendation/medias-traditionnels.feature
rename to docs/domains/recommendation/features/recommendation/medias-traditionnels.feature
diff --git a/features/api/recommendation/mode-kids.feature b/docs/domains/recommendation/features/recommendation/mode-kids.feature
similarity index 100%
rename from features/api/recommendation/mode-kids.feature
rename to docs/domains/recommendation/features/recommendation/mode-kids.feature
diff --git a/features/api/recommendation/parametrabilite-admin.feature b/docs/domains/recommendation/features/recommendation/parametrabilite-admin.feature
similarity index 100%
rename from features/api/recommendation/parametrabilite-admin.feature
rename to docs/domains/recommendation/features/recommendation/parametrabilite-admin.feature
diff --git a/features/api/recommendation/parametrabilite-utilisateur.feature b/docs/domains/recommendation/features/recommendation/parametrabilite-utilisateur.feature
similarity index 100%
rename from features/api/recommendation/parametrabilite-utilisateur.feature
rename to docs/domains/recommendation/features/recommendation/parametrabilite-utilisateur.feature
diff --git a/features/api/recommendation/scoring-recommandation.feature b/docs/domains/recommendation/features/recommendation/scoring-recommandation.feature
similarity index 100%
rename from features/api/recommendation/scoring-recommandation.feature
rename to docs/domains/recommendation/features/recommendation/scoring-recommandation.feature
diff --git a/features/api/search/geolocation-search.feature b/docs/domains/recommendation/features/search/geolocation-search.feature
similarity index 100%
rename from features/api/search/geolocation-search.feature
rename to docs/domains/recommendation/features/search/geolocation-search.feature
diff --git a/docs/regles-metier/04-algorithme-recommandation.md b/docs/domains/recommendation/rules/algorithme-recommandation.md
similarity index 100%
rename from docs/regles-metier/04-algorithme-recommandation.md
rename to docs/domains/recommendation/rules/algorithme-recommandation.md
diff --git a/docs/regles-metier/03-centres-interet-jauges.md b/docs/domains/recommendation/rules/centres-interet-jauges.md
similarity index 100%
rename from docs/regles-metier/03-centres-interet-jauges.md
rename to docs/domains/recommendation/rules/centres-interet-jauges.md
diff --git a/docs/regles-metier/05-interactions-navigation.md b/docs/domains/recommendation/rules/interactions-navigation.md
similarity index 100%
rename from docs/regles-metier/05-interactions-navigation.md
rename to docs/domains/recommendation/rules/interactions-navigation.md
diff --git a/docs/gherkin-moderation-overview.md b/docs/gherkin-moderation-overview.md
index eee42f2..744ac3e 100644
--- a/docs/gherkin-moderation-overview.md
+++ b/docs/gherkin-moderation-overview.md
@@ -1,8 +1,8 @@
# Vue d'ensemble des Features Gherkin - Modération
Ce document récapitule l'organisation complÚte des features Gherkin pour le systÚme de modération de RoadWave, alignées avec les rÚgles métier définies dans :
-- [14-moderation-flows.md](regles-metier/14-moderation-flows.md)
-- [15-moderation-communautaire.md](regles-metier/15-moderation-communautaire.md)
+- [14-moderation-flows.md](domains/moderation/rules/moderation-flows.md)
+- [15-moderation-communautaire.md](domains/moderation/rules/moderation-communautaire.md)
## Structure des Features
@@ -249,8 +249,8 @@ npm run test:e2e
## Documentation Liée
-- [RÚgles métier - Modération Flows](regles-metier/14-moderation-flows.md)
-- [RÚgles métier - Modération Communautaire](regles-metier/15-moderation-communautaire.md)
+- [RÚgles métier - Modération Flows](domains/moderation/rules/moderation-flows.md)
+- [RÚgles métier - Modération Communautaire](domains/moderation/rules/moderation-communautaire.md)
- [ADR-023 - Architecture Modération](adr/023-architecture-moderation.md)
- [ADR-013 - Stratégie Tests](adr/013-strategie-tests.md)
diff --git a/docs/interfaces/README.md b/docs/interfaces/README.md
new file mode 100644
index 0000000..7e551db
--- /dev/null
+++ b/docs/interfaces/README.md
@@ -0,0 +1,58 @@
+# Documentation des Interfaces
+
+Cette section documente les interfaces utilisateur de RoadWave (mobile et web).
+
+## Organisation
+
+### Mobile (Flutter)
+L'application mobile est l'interface principale pour les utilisateurs finaux (conducteurs, piétons, touristes).
+
+- **[Navigation & Architecture](mobile/navigation.md)** : Structure de navigation, routing
+- **Ăcran d'accueil** : Feed de recommandations gĂ©olocalisĂ©es
+- **Lecteur audio** : Player HLS, contrĂŽles, playlists
+- **Carte & découverte** : Vue carte, exploration géographique
+- **Profil & rĂ©glages** : Jauges d'intĂ©rĂȘt, paramĂštres
+
+### Web (Créateurs)
+L'interface web est destinée aux créateurs de contenu et aux annonceurs.
+
+- **Dashboard** : Vue d'ensemble, statistiques
+- **Upload de contenu** : Import audio, métadonnées, géolocalisation
+- **Statistiques** : Analytics, revenus
+
+## Conventions de documentation
+
+### Captures d'écran
+Placez les images dans `docs/interfaces/assets/` et référencez-les ainsi :
+
+```markdown
+{ width="300" }
+```
+
+### Diagrammes de flux
+Utilisez Mermaid pour les parcours utilisateur :
+
+```mermaid
+graph LR
+ A[Ouverture app] --> B{GPS actif?}
+ B -->|Oui| C[Chargement recommandations]
+ B -->|Non| D[Demande permission]
+ D --> C
+```
+
+### Onglets multi-plateformes
+Pour montrer des variations iOS/Android :
+
+=== "iOS"
+ Comportement spécifique iOS
+
+=== "Android"
+ Comportement spécifique Android
+
+## Principes de design
+
+- **Mobile-first** : L'app mobile est l'expérience principale
+- **Géolocalisation centrale** : L'UI doit toujours contextualiser par rapport à la position
+- **Audio en arriĂšre-plan** : Player persistant, mini-player
+- **Mode sombre** : Support obligatoire (conduite de nuit)
+- **Accessibilité** : WCAG 2.1 AA minimum
diff --git a/docs/interfaces/assets/mobile/.gitkeep b/docs/interfaces/assets/mobile/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/interfaces/assets/web/.gitkeep b/docs/interfaces/assets/web/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/interfaces/mobile/navigation.md b/docs/interfaces/mobile/navigation.md
new file mode 100644
index 0000000..93561a0
--- /dev/null
+++ b/docs/interfaces/mobile/navigation.md
@@ -0,0 +1,208 @@
+# Navigation & Architecture Mobile
+
+## Architecture de navigation
+
+L'application mobile utilise une navigation par onglets (Bottom Navigation Bar) avec 4 sections principales.
+
+```mermaid
+graph TD
+ A[App Shell] --> B[đ Accueil]
+ A --> C[đșïž Carte]
+ A --> D[đ” BibliothĂšque]
+ A --> E[đ€ Profil]
+
+ B --> B1[Feed Recommandations]
+ B --> B2[Lecteur Audio]
+
+ C --> C1[Vue Carte]
+ C --> C2[Détail Point]
+
+ D --> D1[Mes Playlists]
+ D --> D2[Contenus Sauvegardés]
+ D --> D3[Historique]
+
+ E --> E1[Jauges IntĂ©rĂȘt]
+ E --> E2[ParamĂštres]
+ E --> E3[Abonnements]
+```
+
+## Bottom Navigation Bar
+
+### Onglet 1 : Accueil đ
+Point d'entrée principal aprÚs le lancement de l'app.
+
+**Fonctionnalités** :
+- Feed de recommandations basĂ© sur la gĂ©olocalisation + intĂ©rĂȘts
+- RafraĂźchissement pull-to-refresh
+- Lecture directe depuis le feed
+
+**Navigation vers** :
+- Détail d'un contenu (push)
+- Lecteur plein écran (modal)
+- Profil d'un créateur (push)
+
+### Onglet 2 : Carte đșïž
+Exploration visuelle des contenus par géolocalisation.
+
+**Fonctionnalités** :
+- Carte interactive (MapLibre GL)
+- Markers pour contenus à proximité
+- Clusters pour zones denses
+- Recherche par adresse
+
+**Navigation vers** :
+- Détail d'un point (bottom sheet)
+- Lecteur audio (modal persistant)
+
+### Onglet 3 : BibliothĂšque đ”
+AccÚs aux contenus sauvegardés, historique, playlists.
+
+**Fonctionnalités** :
+- Playlists personnelles
+- Contenus favoris
+- Historique d'écoute
+- Téléchargements offline
+
+### Onglet 4 : Profil đ€
+Gestion du compte, prĂ©fĂ©rences, jauges d'intĂ©rĂȘt.
+
+**Fonctionnalités** :
+- Visualisation/Ă©dition jauges d'intĂ©rĂȘt
+- ParamĂštres de l'app
+- Gestion abonnement Premium
+- Déconnexion
+
+## Lecteur Audio (Modal persistant)
+
+Le lecteur est un composant modal qui persiste lors de la navigation entre onglets.
+
+```mermaid
+stateDiagram-v2
+ [*] --> Collapsed: Lecture démarre
+ Collapsed --> Expanded: Tap sur mini-player
+ Expanded --> Collapsed: Swipe down
+ Collapsed --> [*]: Stop audio
+
+ Expanded --> Queue: Tap "Ă suivre"
+ Queue --> Expanded: Retour
+```
+
+=== "Ătat Collapsed (Mini-player)"
+ - Hauteur : 60dp
+ - Position : Bottom (au-dessus de la Bottom Nav Bar)
+ - Affiche : Titre, artiste, play/pause, skip
+ - Interaction : Tap pour expand
+
+=== "Ătat Expanded (Lecteur plein Ă©cran)"
+ - Plein écran modal
+ - Cover art grande taille
+ - ContrÎles avancés (repeat, shuffle, queue)
+ - Scrubber timeline
+ - Boutons : like, share, download, add to playlist
+
+## Routing Flutter
+
+### Configuration
+
+Utilisation de **go_router** (voir [ADR-020](../../adr/020-librairies-flutter.md)).
+
+```dart
+// Exemple simplifié
+GoRouter(
+ routes: [
+ ShellRoute(
+ builder: (context, state, child) => AppShell(child: child),
+ routes: [
+ GoRoute(path: '/home', builder: (context, state) => HomeScreen()),
+ GoRoute(path: '/map', builder: (context, state) => MapScreen()),
+ GoRoute(path: '/library', builder: (context, state) => LibraryScreen()),
+ GoRoute(path: '/profile', builder: (context, state) => ProfileScreen()),
+ ],
+ ),
+ GoRoute(
+ path: '/content/:id',
+ builder: (context, state) => ContentDetailScreen(
+ contentId: state.pathParameters['id']!,
+ ),
+ ),
+ ],
+);
+```
+
+### Deep Links
+
+L'app supporte les deep links pour :
+- `roadwave://content/{id}` : Ouvrir un contenu spécifique
+- `roadwave://map?lat={lat}&lon={lon}` : Ouvrir la carte Ă une position
+- `roadwave://profile` : Ouvrir le profil
+
+## Gestion d'état
+
+- **Provider** pour l'état global (user, player, location)
+- **BLoC** pour les features complexes (recommendation, map)
+- **Riverpod** pour l'injection de dépendances
+
+Voir [ADR-020](../../adr/020-librairies-flutter.md) pour les détails.
+
+## Permissions systĂšme
+
+La navigation gĂšre les demandes de permissions de maniĂšre contextuelle :
+
+1. **Géolocalisation** : Demandée au premier lancement, avant d'afficher l'accueil
+2. **Notifications** : Demandée aprÚs 3 sessions utilisateur (opt-in soft)
+3. **Stockage** : Demandée lors du premier téléchargement offline
+
+Voir [mobile/permissions-strategy.md](../../mobile/permissions-strategy.md) pour la stratégie complÚte.
+
+## Transitions et animations
+
+### Transitions entre onglets
+- Aucune animation (changement instantané)
+- Préservation du scroll state sur chaque onglet
+
+### Navigation push/pop
+- iOS : Slide transition (standard Cupertino)
+- Android : Fade + Slide transition (Material Design)
+
+### Mini-player expand/collapse
+- Spring animation (bounce léger)
+- Durée : 300ms
+- Curve : `Curves.easeInOutCubic`
+
+## Gestion du back button (Android)
+
+```mermaid
+graph TD
+ A[Back pressed] --> B{Lecteur expanded?}
+ B -->|Oui| C[Collapse lecteur]
+ B -->|Non| D{Sur onglet Accueil?}
+ D -->|Non| E[Retour Ă Accueil]
+ D -->|Oui| F{Audio en cours?}
+ F -->|Oui| G[Dialog: Quitter?]
+ F -->|Non| H[Quitter app]
+ G -->|Confirme| H
+ G -->|Annule| I[Rester]
+```
+
+## Accessibilité
+
+- **Screen readers** : Labels sémantiques sur tous les boutons
+- **Navigation clavier** : Support complet (pour tablettes avec clavier)
+- **Contraste** : WCAG 2.1 AA minimum (4.5:1 pour texte)
+- **Taille des touch targets** : 48dp minimum
+
+## Mode sombre
+
+Support obligatoire du mode sombre (conduite de nuit).
+
+=== "Mode Clair"
+ - Fond : White / Light Gray (#F5F5F5)
+ - Texte : Dark Gray (#212121)
+ - Accent : Indigo (#3F51B5)
+
+=== "Mode Sombre"
+ - Fond : Dark (#121212)
+ - Texte : White (#FFFFFF)
+ - Accent : Indigo clair (#7986CB)
+
+Détection automatique via `MediaQuery.platformBrightness` ou choix manuel dans les paramÚtres.
diff --git a/docs/mobile/permissions-strategy.md b/docs/mobile/permissions-strategy.md
index 60e634b..05060e1 100644
--- a/docs/mobile/permissions-strategy.md
+++ b/docs/mobile/permissions-strategy.md
@@ -852,8 +852,8 @@ void main() {
## Références
- **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)
+- **RÚgle 05** : [Mode Piéton](../domains/recommendation/rules/interactions-navigation.md#512-mode-piéton-audio-guides)
+- **RÚgle 02** : [Conformité RGPD](../domains/_shared/rules/rgpd.md)
- **Apple Guidelines** : [Location Best Practices](https://developer.apple.com/design/human-interface-guidelines/location)
- **Android Guidelines** : [Request Background Location](https://developer.android.com/training/location/permissions#request-background-location)
diff --git a/docs/mobile/testflight-validation-plan.md b/docs/mobile/testflight-validation-plan.md
index 2c4e743..01d03b0 100644
--- a/docs/mobile/testflight-validation-plan.md
+++ b/docs/mobile/testflight-validation-plan.md
@@ -609,7 +609,7 @@ Location Data :
- [Stratégie Permissions](permissions-strategy.md)
- [ADR-010 Frontend Mobile](../adr/010-frontend-mobile.md)
-- [RÚgle 05 Mode Piéton](../regles-metier/05-interactions-navigation.md)
+- [RÚgle 05 Mode Piéton](../domains/recommendation/rules/interactions-navigation.md)
---
diff --git a/docs/regles-metier/README.md b/docs/regles-metier/README.md
deleted file mode 100644
index af43bf6..0000000
--- a/docs/regles-metier/README.md
+++ /dev/null
@@ -1,296 +0,0 @@
-# RÚgles métier RoadWave
-
-> Documentation complÚte des rÚgles métier validées pour l'application RoadWave.
-> Chaque section détaille les comportements, flux et décisions techniques.
-
----
-
-## đ Table des matiĂšres
-
----
-
-## đïž Fondations & Compte utilisateur
-
-### [01. Authentification & Inscription](01-authentification-inscription.md)
-
-**Contenu** : Inscription, connexion, récupération de compte
-
-- Inscription : email/password uniquement (pas d'OAuth tiers)
-- Vérification email : optionnelle auditeurs (limite 5 contenus), obligatoire créateurs (lien expire 7j)
-- Connexion : 5 tentatives max, blocage 15 min, refresh token 30j
-- Récupération mot de passe : email, lien expire 1h
-
----
-
-### [02. Conformité RGPD](02-conformite-rgpd.md)
-
-**Contenu** : Consentements, anonymisation, export, suppression
-
-- Consentement : Tarteaucitron.js + PostgreSQL versioning
-- GPS prĂ©cis : 24h puis geohash 5 (~5kmÂČ)
-- Export : JSON + HTML + audio â ZIP, gĂ©nĂ©ration asynchrone sous 48h, expire 7j
-- Suppression : grace period 30j, contenus créés anonymisés (créateur = "Utilisateur supprimé")
-- Analytics : Matomo self-hosted, IP anonymisées, 0 cookie tiers
-- DPO : fondateur formé CNIL (non obligatoire <250 employés)
-
----
-
-## đ§ Consommation de contenu (Auditeur)
-
-### [03. Centres d'intĂ©rĂȘt et jauges](03-centres-interet-jauges.md)
-
-**Contenu** : Ăvolution jauges, valeurs initiales
-
-- Like automatique : Ă©coute â„80% â +2%, Ă©coute 30-79% â +1%
-- Like explicite (manuel) : +2% (cumulable avec auto)
-- Abonnement : +5%
-- Skip rapide (<10s) : -0.5%
-- Valeur initiale : 50% (neutre)
-- Limites : 0-100% stricte, pas de dégradation temporelle
-
----
-
-### [04. Algorithme de recommandation](04-algorithme-recommandation.md)
-
-**Contenu** : Scoring, géolocalisation, orientation politique, mode Kids
-
-- Classification géo : Ancré (70%) / Contextuel (50%) / Neutre (20%)
-- Engagement : 20%, Aléatoire : 10%
-- Orientation politique : 5 niveaux, équilibre imposé (40/40/20)
-- Mode Kids : 4 tranches (3-6 / 6-9 / 9-12 / 13-15 ans), activation auto <13 ans
-- Historique : >80% jamais reproposer, <10s ne pas reproposer
-
----
-
-### [05. Interactions et navigation](05-interactions-navigation.md)
-
-**Contenu** : Commandes Suivant/Précédent, interactions volant, lecture en boucle
-
-- Suivant : pré-calcul 5 contenus, recalcul >10km ou 10 min
-- PrĂ©cĂ©dent : <10s â contenu avant, â„10s â replay dĂ©but
-- Commandes volant : Suivant, Précédent, Play/Pause uniquement
-- Like automatique : â„80% Ă©coute â +2 points, 30-79% â +1 point
-- Actions manuelles : bouton cĆur (arrĂȘt vĂ©hicule) ou vocal (CarPlay/Android Auto)
-- Passage auto aprĂšs 2s (1s mode Kids)
-
----
-
-### [06. Audio-guides multi-séquences](06-audio-guides-multi-sequences.md)
-
-**Contenu** : Modes déplacement, navigation, déclenchement GPS, publicités
-
-- **4 modes** : đ¶ PiĂ©ton (manuel) / đ Voiture (GPS auto + manuel) / đŽ VĂ©lo / đ Transport
-- **Mode Piéton** : pause auto aprÚs chaque séquence, user clique Suivant, navigation libre
-- **Mode Voiture** : déclenchement GPS auto (rayon 30m), boutons manuels actifs, warning sécurité >10 km/h
-- **Affichage voiture** : distance temps réel + ETA + direction (flÚche) + vitesse
-- **Rayons** : Voiture 30m, Vélo 50m, Transport 100m (configurable créateur 10-200m)
-- **Publicités** : 1/5 séquences tous modes, auto-play, skippable 5s
-- **Reprise** : sauvegarde auto (séquence + position exacte), popup si <30j, multi-device (sync cloud)
-
----
-
-### [07. Contenus géolocalisés voiture](07-contenus-geolocalises-voiture.md)
-
-**Contenu** : Expérience voiture, UI minimaliste, sécurité
-
-- Interface voiture : minimaliste, boutons larges (80Ă80px min), lecture auto-play
-- Commandes vocales : OK Google/Siri + CarPlay/Android Auto
-- Notifications : in-app uniquement (pas de push), badge discret
-- Sécurité : warning si interaction manuelle >10 km/h
-- Mode nuit : automatique selon luminosité GPS ou heure (22h-6h)
-
----
-
-### [08. Mode offline](08-mode-offline.md)
-
-**Contenu** : Téléchargement, validité, synchronisation
-
-- Zone géographique : choix manuel (autour de moi / ville / département / région)
-- Nombre contenus : gratuit 50 max, Premium illimité
-- WiFi par défaut, mobile avec confirmation + estimation volume
-- Validité : 30 jours, renouvellement auto si WiFi (contenus >25 jours)
-- Sync : likes/abonnements batch auto Ă reconnexion, queue actions 7j max
-
----
-
-### [09. Abonnements et notifications](09-abonnements-notifications.md)
-
-**Contenu** : Impact algorithme, notifications, audio-guides, limites
-
-- Boost +30% au score final (pas priorité absolue)
-- Détection contexte : <5 km/h piéton, >10 km/h voiture
-- Voiture : in-app uniquement, Piéton : push actives
-- Limite 10 notifications push/jour (5-20), mode silencieux 22h-8h
-- Audio-guide piéton : détection <100m lieu, page sélection, navigation manuelle
-- Max 200 abonnements, +5% jauges tous tags créateur
-
----
-
-### [10. Gestion des erreurs](10-gestion-erreurs.md)
-
-**Contenu** : Aucun contenu, contenu supprimé, perte réseau, GPS désactivé
-
-- Aucun contenu : Ă©largissement auto 50km â 100km â dĂ©partement â rĂ©gion â national
-- Contenu supprimé : laisser terminer, passage auto suivant aprÚs 2s
-- Perte rĂ©seau : buffer adaptatif (WiFi 5-120s, 4G 10-120s, 3G 30-300s), retry 5s max 6Ă
-- GPS désactivé : mode dégradé (contenu national + neutre + téléchargé)
-
----
-
-## đïž CrĂ©ation de contenu (CrĂ©ateur)
-
-### [11. Création et publication de contenu](11-creation-publication-contenu.md)
-
-**Contenu** : Upload, métadonnées, validation, modification
-
-- Formats : MP3, AAC (.mp3, .aac, .m4a), max 200 MB, 4h
-- Métadonnées obligatoires : titre, type géo, zone, tags (1-3), classification ùge
-- Validation 3 premiers contenus : 24-48h (modération RoadWave)
-- Modification : métadonnées uniquement, pas audio/zone/classification
-
----
-
-### [12. Radio live](12-radio-live.md)
-
-**Contenu** : DĂ©marrage, arrĂȘt, comportement auditeur
-
-- Buffer 15s avant diffusion publique, durée max 8h
-- Notification push abonnés dans zone géo uniquement
-- ArrĂȘt : compte Ă rebours 5s (manuel) ou auto si dĂ©co â„60s
-- Enregistrement auto MP3 256 kbps â replay sous 5-10 min
-- Auditeur : buffer 15s, continuation si sortie zone, AUCUN chat
-
----
-
-### [13. Détection de contenu protégé](13-detection-contenu-protege.md)
-
-**Contenu** : Droits d'auteur, détection musique, sanctions, fair use
-
-- PérimÚtre MVP : musique uniquement (films/livres exclus)
-- Fair use : extraits â€30s autorisĂ©s si usage transformatif (critique/analyse)
-- DĂ©tection : manuelle lors des 3 premiers contenus (coĂ»t 0âŹ)
-- Sanctions progressives : Avertissement â Strike 1 (3j) â Strike 2 (7j) â Strike 3 (30j) â Strike 4 (ban)
-- Réhabilitation : -1 strike tous les 6 mois sans incident
-- Appel : réutilise processus section 14, délai 72h, preuve licence acceptée
-- Post-MVP : Chromaprint + MusicBrainz si >50 signalements/mois (50-100âŹ/mois)
-
----
-
-## đĄïž ModĂ©ration & SĂ©curitĂ©
-
-### [14. Modération - Flows opérationnels](14-moderation-flows.md)
-
-**Contenu** : Signalement, traitement, sanctions
-
-- Signalement : 7 catégories (haine, sexuel, illégalité, droits auteur, spam, fake news, autre)
-- IA pré-filtre : Whisper large-v3 (transcription) + NLP open source (1-10 min)
-- SLA : Critique <2h (24/7), Haute/Moyenne <24h, Basse <72h
-- Notification sanction : email + push + in-app (détail complet : catégorie, timestamp, transcription)
-- Appel : formulaire in-app, délai 7j max, réponse 72h garanti (standard)
-
----
-
-### [15. Modération Communautaire - Badges et Récompenses](15-moderation-communautaire.md)
-
-**Contenu** : SystÚme badges, score fiabilité, récompenses, anti-abus
-
-- **3 niveaux badges** : đ„ Bronze (5 validĂ©s), đ„ Argent (20 validĂ©s), đ„ Or (50 validĂ©s)
-- **Modal découverte** : affichage unique au 1er signalement, message gratifiant
-- **Score fiabilité** : calcul auto pour priorisation algorithme (0-100 points)
-- **Utilisateurs de confiance** : statut auto Argent/Or, traitement prioritaire <12h
-- **RĂ©duction Premium Or** : -50% pendant 3 mois (2.49⏠au lieu de 4.99âŹ), Post-MVP
-- **Anti-abus** : limite 10 signalements/24h, audit trimestriel, révocation badges
-- **ROI** : positif dÚs 2-3 utilisateurs Or (économie modération > coût réductions)
-- **CoĂ»t MVP** : 0⏠/ **CoĂ»t Post-MVP** : 0-200âŹ/mois
-
----
-
-## đ° MonĂ©tisation & Business
-
-### [16. Publicités](16-publicites.md)
-
-**Contenu** : Campagnes, fréquence, insertion, facturation
-
-- Interface self-service, budget min 50âŹ, Ă©talement paramĂ©trable
-- Fréquence : 1/5 contenus (gratuits uniquement)
-- Durée : 10-60s (recommandé 15-30s), skippable aprÚs 5s
-- Validation manuelle 24-48h, prépaiement Mangopay
-- Facturation : Ă©coute complĂšte 0.05âŹ, skip aprĂšs 5s : 0.02âŹ, skip immĂ©diat : 0âŹ
-
----
-
-### [17. Premium](17-premium.md)
-
-**Contenu** : Offre, multi-devices, avantages, gestion abonnement
-
-- Prix : 4.99âŹ/mois OU 49.99âŹ/an (4.16âŹ/mois effectif)
-- Pas d'essai gratuit, pas de partage familial (MVP)
-- Multi-devices : 1 seul stream actif, détection connexion simultanée
-- Avantages : 0 pub, contenus exclusifs đ, qualitĂ© 64 kbps Opus, offline illimitĂ©
-- Paiement : Mangopay (web) ou IAP iOS/Android 5.99âŹ/mois (+30% commission)
-
----
-
-### [18. Monétisation créateurs](18-monetisation-createurs.md)
-
-**Contenu** : Activation, KYC, sources revenus, paiement
-
-- Conditions : compte â„3 mois, â„500 abonnĂ©s, â„10K Ă©coutes, 0 strike, â„5 contenus/90j
-- KYC via Mangopay Connect : SIRET, TVA, RIB pro, piĂšce ID, Kbis <3 mois
-- Revenus pub : 3⏠/ 1000 écoutes complÚtes (6% CA pub)
-- Revenus Premium : 70% créateur, 30% plateforme (proportionnel temps écoute)
-- Paiement : seuil 50âŹ, mensuel (15 du mois suivant), SEPA Mangopay
-
----
-
-## đ§ FonctionnalitĂ©s transverses
-
-### [19. Autres comportements](19-autres-comportements.md)
-
-**Contenu** : Partage, profil créateur, recherche
-
-- Partage : bouton partout, lien `roadwave.fr/share/c/[id]`, web player + deep link
-- Profil crĂ©ateur : @pseudo, bio (300 car), stats publiques arrondies, badge vĂ©rifiĂ© â
-- Badge vérifié : KYC validé OU célébrité OU >10K abonnés
-- Recherche : full-text PostgreSQL (français, stemming), recherche géo (Nominatim OSM)
-- Filtres : type, durée, ùge, géo, tags, date, premium (combinables)
-- Affichage : liste enrichie (20/page, infinite scroll) + vue carte Leaflet
-
----
-
-## đïž Organisation
-
-Chaque fichier de rÚgles métier suit la structure :
-
-1. **Décisions** : choix validés avec justifications
-2. **Comportements détaillés** : flux utilisateur, cas limites
-3. **ParamÚtres** : valeurs exactes, seuils, durées
-4. **Points d'attention Gherkin** : éléments à tester
-
----
-
-## đ Utilisation
-
-Ces documents servent de **référence unique** pour :
-
-- â
Développement backend/frontend
-- â
Ăcriture des tests Gherkin (BDD)
-- â
Validation QA
-- â
Documentation produit
-
-**Prochaine étape** : Création des fichiers `.feature` Gherkin dans `features/` basés sur ces rÚgles.
-
----
-
-## đ Statistiques
-
-- **19 sections** validées
-- **~14 500 lignes** de spécifications détaillées
-- **CoĂ»t infrastructure MVP** : ~50-250âŹ/mois (hors salaires)
-- **CoĂ»t Post-MVP** : +0-200âŹ/mois (rĂ©ductions Premium contributeurs Or)
-- **Technologies** : 100% open source (sauf Mangopay paiements)
-
----
-
-**DerniĂšre mise Ă jour** : Janvier 2026
-**Statut** : â
Toutes sections validées + Modération communautaire ajoutée
diff --git a/features/ui/interest-gauges/degradation-temporelle.feature b/features/ui/interest-gauges/degradation-temporelle.feature
deleted file mode 100644
index e572496..0000000
--- a/features/ui/interest-gauges/degradation-temporelle.feature
+++ /dev/null
@@ -1,142 +0,0 @@
-# language: fr
-Fonctionnalité: Pas de dégradation temporelle des jauges
- En tant que systĂšme de recommandation
- Je veux que les jauges n'évoluent que par les actions utilisateur
- Afin d'avoir un comportement prévisible et fiable
-
- Contexte:
- Ătant donnĂ© que l'API RoadWave est disponible
- Et qu'un utilisateur est connecté
-
- Scénario: Aucune dégradation automatique avec le temps
- Ătant donnĂ© que ma jauge "Ăconomie" est Ă 80%
- Et que je n'écoute aucun contenu pendant 30 jours
- Quand je me reconnecte aprĂšs 30 jours
- Alors ma jauge "Ăconomie" est toujours Ă 80%
- Et aucune dégradation temporelle n'a été appliquée
-
- Scénario: Jauges conservées aprÚs 6 mois d'inactivité
- Ătant donnĂ© que mes jauges sont:
- | catégorie | niveau |
- | Automobile | 75% |
- | Voyage | 60% |
- | Musique | 45% |
- Et que je pars en vacances pendant 6 mois sans utiliser l'app
- Quand je me reconnecte aprĂšs 6 mois
- Alors mes jauges sont exactement les mĂȘmes:
- | catégorie | niveau |
- | Automobile | 75% |
- | Voyage | 60% |
- | Musique | 45% |
-
- ScĂ©nario: Ăvolution naturelle par les actions
- Ătant donnĂ© que j'aimais "Ăconomie" il y a 1 an (jauge 80%)
- Et que depuis, je skip tous les contenus "Ăconomie"
- Et que j'ai skippĂ© 50 contenus "Ăconomie" en 1 an
- Alors ma jauge "Ăconomie" descend naturellement via les skips
- Et atteint environ 55% (80% - 50 Ă 0.5% = 55%)
- Et la dégradation vient des actions, pas du temps
-
- Scénario: Pas de cron job de dégradation
- Ătant donnĂ© que le systĂšme vĂ©rifie les jauges quotidiennement
- Quand un utilisateur n'a pas d'activité depuis 90 jours
- Alors aucun job de dégradation n'est exécuté
- Et les jauges restent inchangées
- Et aucune ressource CPU n'est consommée pour la dégradation
-
- Scénario: Comportement prévisible aprÚs absence
- Ătant donnĂ© que ma jauge "Sport" Ă©tait Ă 70%
- Et que je n'utilise pas l'app pendant 1 an
- Quand je reviens et demande des recommandations
- Alors mes recommandations reflÚtent toujours mes goûts d'avant
- Et je reçois du contenu "Sport" prioritaire
- Et le comportement est cohérent et prévisible
-
- ScĂ©nario: RĂ©initialiser manuellement mes centres d'intĂ©rĂȘt
- Ătant donnĂ© que je veux repartir de zĂ©ro
- Quand je vais dans les paramĂštres
- Et que je clique sur "RĂ©initialiser mes centres d'intĂ©rĂȘt"
- Et que je confirme l'action
- Alors toutes mes jauges reviennent Ă 50%
- Et je vois le message "Vos centres d'intĂ©rĂȘt ont Ă©tĂ© rĂ©initialisĂ©s"
-
- Scénario: Confirmation avant réinitialisation
- Ătant donnĂ© que je suis dans les paramĂštres
- Quand je clique sur "RĂ©initialiser mes centres d'intĂ©rĂȘt"
- Alors je vois un message de confirmation:
- | titre | Ătes-vous sĂ»r ? |
- | message | Cette action remettra toutes vos jauges Ă 50% |
- | actions | Confirmer / Annuler |
-
- Scénario: Annuler la réinitialisation
- Ătant donnĂ© que j'ai cliquĂ© sur "RĂ©initialiser mes centres d'intĂ©rĂȘt"
- Et que la confirmation est affichée
- Quand je clique sur "Annuler"
- Alors mes jauges ne sont pas modifiées
- Et je reviens aux paramĂštres
-
- Scénario: Raison de réinitialisation - changement de vie
- Ătant donnĂ© que j'utilisais RoadWave pour mes trajets professionnels
- Et que mes jauges reflĂ©taient "Ăconomie" (85%) et "Technologie" (75%)
- Et que je change de vie et deviens musicien
- Quand je rĂ©initialise mes centres d'intĂ©rĂȘt
- Alors je peux repartir avec toutes les jauges Ă 50%
- Et découvrir du contenu "Musique" et "Culture" sans biais
-
- Scénario: Pas de suggestion automatique de réinitialisation
- Ătant donnĂ© que je n'ai pas utilisĂ© l'app depuis 1 an
- Quand je me reconnecte
- Alors aucune suggestion de réinitialisation n'est affichée
- Et mes jauges sont conservées telles quelles
- Et je garde le contrĂŽle total
-
- Scénario: Historique conservé aprÚs réinitialisation
- Ătant donnĂ© que j'ai Ă©coutĂ© 500 contenus
- Quand je rĂ©initialise mes centres d'intĂ©rĂȘt
- Alors mes jauges reviennent Ă 50%
- Mais mon historique d'écoute est conservé
- Et je peux toujours consulter mes anciens contenus écoutés
-
- ScĂ©nario: Ăvolution future basĂ©e sur nouvelles actions
- Ătant donnĂ© que j'ai rĂ©initialisĂ© mes jauges Ă 50%
- Quand j'écoute 5 contenus "Voyage" à >80%
- Alors ma jauge "Voyage" monte Ă 60% (50% + 5 Ă 2%)
- Et l'algorithme recommence à apprendre mes nouvelles préférences
-
- Scénario: Respect de l'historique utilisateur
- Ătant donnĂ© qu'un utilisateur aime "Cryptomonnaie" depuis 2 ans
- Et que sa jauge est Ă 90%
- Quand 2 ans s'écoulent sans dégradation temporelle
- Alors sa jauge reste Ă 90%
- Car l'historique de ses goûts est respecté
- Et le systĂšme ne fait pas d'"oubli" artificiel
-
- Scénario: Coût infrastructure zéro
- Ătant donnĂ© qu'aucune dĂ©gradation temporelle n'existe
- Quand le systĂšme calcule les jauges
- Alors aucun calcul de date n'est nécessaire
- Et aucun batch nocturne ne tourne
- Et aucun bug de fuseau horaire ne peut survenir
- Et le coût CPU est minimal
-
- Scénario: UX prévisible - jauge = actions
- Ătant donnĂ© qu'un utilisateur consulte sa jauge "Sport" Ă 65%
- Quand il se demande pourquoi elle est Ă 65%
- Alors il peut retracer ses actions:
- | action | impact |
- | 10 likes automatiques | +10% |
- | 3 abonnements Sport | +15% |
- | 5 skips de contenu non-Sport| 0% |
- Et il comprend que c'est le reflet exact de ses actions
- Et il n'y a pas de mystÚre ou automatisme caché
-
- Scénario: Statistiques affichées sans date
- Ătant donnĂ© que je consulte mes centres d'intĂ©rĂȘt
- Quand je vois mes jauges
- Alors je vois:
- | information | affiché |
- | Niveau actuel | â
75% |
- | Ăvolution depuis dĂ©but | â
+25% |
- | DerniĂšre mise Ă jour | â |
- Et aucune date n'est affichée car non pertinente
- Et seules les actions comptent
diff --git a/features/ui/interest-gauges/evolution-jauges.feature b/features/ui/interest-gauges/evolution-jauges.feature
deleted file mode 100644
index ffc528c..0000000
--- a/features/ui/interest-gauges/evolution-jauges.feature
+++ /dev/null
@@ -1,237 +0,0 @@
-# language: fr
-FonctionnalitĂ©: Ăvolution des jauges d'intĂ©rĂȘt
- En tant que systĂšme de recommandation
- Je veux faire Ă©voluer les jauges d'intĂ©rĂȘt selon les actions utilisateur
- Afin d'affiner les recommandations personnalisées
-
- Contexte:
- Ătant donnĂ© que l'API RoadWave est disponible
- Et qu'un utilisateur est connecté
-
- ScĂ©nario: Like automatique renforcĂ© aprĂšs Ă©coute â„80%
- Ătant donnĂ© qu'un contenu de 5 minutes est taguĂ© "Automobile"
- Et que ma jauge "Automobile" est Ă 45%
- Quand j'écoute le contenu pendant 4 minutes 30 secondes (90%)
- Alors je reçois un like automatique renforcé
- Et ma jauge "Automobile" augmente de 2%
- Et ma jauge "Automobile" est maintenant Ă 47%
-
- Scénario: Like automatique renforcé exactement à 80%
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Voyage"
- Et que ma jauge "Voyage" est Ă 60%
- Quand j'écoute le contenu pendant exactement 8 minutes (80%)
- Alors je reçois un like automatique renforcé
- Et ma jauge "Voyage" augmente de 2%
- Et ma jauge "Voyage" est maintenant Ă 62%
-
- Scénario: Like automatique standard aprÚs écoute 30-79%
- Ătant donnĂ© qu'un contenu de 5 minutes est taguĂ© "Automobile"
- Et que ma jauge "Automobile" est Ă 45%
- Quand j'écoute le contenu pendant 2 minutes 30 secondes (50%)
- Alors je reçois un like automatique standard
- Et ma jauge "Automobile" augmente de 1%
- Et ma jauge "Automobile" est maintenant Ă 46%
-
- Scénario: Like automatique standard à 30% exactement
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Musique"
- Et que ma jauge "Musique" est Ă 40%
- Quand j'écoute le contenu pendant exactement 3 minutes (30%)
- Alors je reçois un like automatique standard
- Et ma jauge "Musique" augmente de 1%
-
- Scénario: Like automatique standard à 79%
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Sport"
- Et que ma jauge "Sport" est Ă 55%
- Quand j'écoute le contenu pendant 7 minutes 54 secondes (79%)
- Alors je reçois un like automatique standard
- Et ma jauge "Sport" augmente de 1%
- Et ma jauge "Sport" est maintenant Ă 56%
-
- Scénario: Like explicite (manuel) +2%
- Ătant donnĂ© qu'un contenu est taguĂ© "Ăconomie"
- Et que ma jauge "Ăconomie" est Ă 70%
- Quand j'écoute le contenu partiellement
- Et que je clique manuellement sur le bouton "Like"
- Alors ma jauge "Ăconomie" augmente de 2%
- Et ma jauge "Ăconomie" est maintenant Ă 72%
-
- Scénario: Like manuel cumulable avec like automatique
- Ătant donnĂ© qu'un contenu de 5 minutes est taguĂ© "Automobile"
- Et que ma jauge "Automobile" est Ă 45%
- Quand j'écoute le contenu pendant 2 minutes 30 secondes (50%)
- Alors je reçois un like automatique standard (+1%)
- Quand je clique ensuite sur le bouton "Like"
- Alors ma jauge augmente encore de 2% (like manuel)
- Et ma jauge "Automobile" a augmenté de 3% au total
- Et ma jauge "Automobile" est maintenant Ă 48%
-
- Scénario: Abonnement créateur impacte tous ses tags
- Ătant donnĂ© qu'un crĂ©ateur publie des contenus taguĂ©s "Automobile" et "Technologie"
- Et que mes jauges sont:
- | catégorie | niveau |
- | Automobile | 50% |
- | Technologie | 45% |
- Quand je m'abonne à ce créateur
- Alors ma jauge "Automobile" augmente de 5%
- Et ma jauge "Technologie" augmente de 5%
- Et mes nouvelles jauges sont:
- | catégorie | niveau |
- | Automobile | 55% |
- | Technologie | 50% |
-
- Scénario: Désabonnement créateur retire les bonus de tous ses tags
- Ătant donnĂ© qu'un crĂ©ateur publie des contenus taguĂ©s "Voyage" et "Culture gĂ©nĂ©rale"
- Et que mes jauges sont:
- | catégorie | niveau |
- | Voyage | 65% |
- | Culture générale | 58% |
- Et que je suis abonné à ce créateur
- Quand je me désabonne de ce créateur
- Alors ma jauge "Voyage" diminue de 5%
- Et ma jauge "Culture générale" diminue de 5%
- Et mes nouvelles jauges sont:
- | catégorie | niveau |
- | Voyage | 60% |
- | Culture générale | 53% |
-
- Scénario: Skip rapide (<10s) diminue la jauge
- Ătant donnĂ© qu'un contenu est taguĂ© "Ăconomie"
- Et que ma jauge "Ăconomie" est Ă 45%
- Quand je skip le contenu aprĂšs 5 secondes
- Alors ma jauge "Ăconomie" diminue de 0.5%
- Et ma jauge "Ăconomie" est maintenant Ă 44.5%
-
- Scénario: Skip à exactement 10s ne diminue pas la jauge
- Ătant donnĂ© qu'un contenu est taguĂ© "Politique"
- Et que ma jauge "Politique" est Ă 50%
- Quand je skip le contenu aprĂšs exactement 10 secondes
- Alors ma jauge "Politique" ne change pas
- Et reste Ă 50%
-
- Scénario: Skip à exactement 30% déclenche like auto puis skip neutre
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Musique"
- Et que ma jauge "Musique" est Ă 60%
- Quand j'écoute pendant 3 minutes (30%)
- Alors je reçois un like automatique standard (+1%)
- Quand je skip ensuite
- Alors ma jauge "Musique" ne diminue pas (signal neutre)
- Et ma jauge "Musique" est maintenant à 61% (like auto déjà appliqué)
-
- Scénario: Skip tardif entre 30% et 79% ne diminue pas la jauge
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Sport"
- Et que ma jauge "Sport" est Ă 55%
- Quand j'écoute pendant 5 minutes (50%)
- Alors je reçois un like automatique standard (+1%)
- Et ma jauge "Sport" est maintenant Ă 56%
- Quand je skip aprÚs avoir écouté 50%
- Alors ma jauge "Sport" ne diminue pas
- Et reste Ă 56%
-
- Scénario: Contenu avec plusieurs tags impacte toutes les jauges
- Ătant donnĂ© qu'un contenu est taguĂ© "Automobile" et "Voyage"
- Et que mes jauges sont:
- | catégorie | niveau |
- | Automobile | 45% |
- | Voyage | 60% |
- Quand j'écoute le contenu à 90%
- Alors les deux jauges augmentent de 2%
- Et mes nouvelles jauges sont:
- | catégorie | niveau |
- | Automobile | 47% |
- | Voyage | 62% |
-
- Scénario: Contenu avec 3 tags impacte les 3 jauges
- Ătant donnĂ© qu'un contenu est taguĂ© "Sport", "SantĂ©" et "Technologie"
- Et que mes jauges sont à 50% pour chaque catégorie
- Quand je skip rapidement aprĂšs 5 secondes
- Alors les 3 jauges diminuent de 0.5%
- Et toutes passent Ă 49.5%
-
- Scénario: Jauges bornées - ne peut pas dépasser 100%
- Ătant donnĂ© que ma jauge "Cryptomonnaie" est Ă 99%
- Et qu'un contenu tagué "Cryptomonnaie" est disponible
- Quand j'écoute le contenu à 95% (like auto renforcé +2%)
- Alors ma jauge "Cryptomonnaie" passe Ă 100% (maximum)
- Et ne dépasse pas 100%
-
- Scénario: Jauges bornées - ne peut pas descendre sous 0%
- Ătant donnĂ© que ma jauge "Politique" est Ă 0.3%
- Et qu'un contenu tagué "Politique" est disponible
- Quand je skip rapidement aprĂšs 3 secondes (-0.5%)
- Alors ma jauge "Politique" passe Ă 0% (minimum)
- Et ne devient pas négative
-
- Scénario: Désabonnement avec jauge proche de 0% respecte la borne
- Ătant donnĂ© qu'un crĂ©ateur publie des contenus taguĂ©s "Ăconomie"
- Et que ma jauge "Ăconomie" est Ă 3%
- Et que je suis abonné à ce créateur
- Quand je me désabonne de ce créateur
- Alors ma jauge "Ăconomie" devrait diminuer de 5%
- Mais elle passe à 0% (minimum respecté)
- Et ne devient pas négative
-
- ScĂ©nario: Ăcoute entre 10s et 30% n'impacte pas la jauge
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "SantĂ©"
- Et que ma jauge "Santé" est à 50%
- Quand j'écoute pendant 2 minutes (20%)
- Et que je skip ensuite
- Alors ma jauge "Santé" ne change pas
- Et reste Ă 50%
- Car l'écoute est entre 10s (pas de pénalité) et 30% (pas de like auto)
-
- Scénario: Calcul immédiat à chaque action
- Ătant donnĂ© que ma jauge "Voyage" est Ă 50%
- Quand j'écoute un contenu "Voyage" à 85%
- Alors la jauge est mise à jour immédiatement (pas de batch)
- Et passe Ă 52%
- Quand je demande mes recommandations dans la seconde suivante
- Alors l'algorithme utilise déjà la valeur 52%
-
- Scénario: Like manuel aprÚs écoute <30% (pas de like auto)
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Culture"
- Et que ma jauge "Culture" est Ă 60%
- Quand j'écoute pendant 2 minutes (20%)
- Alors je ne reçois pas de like automatique
- Quand je clique sur le bouton "Like"
- Alors ma jauge "Culture" augmente de 2% uniquement
- Et ma jauge "Culture" est maintenant Ă 62%
-
- Scénario: Unlike retire le like manuel
- Ătant donnĂ© que j'ai likĂ© manuellement un contenu "Sport"
- Et que ma jauge "Sport" est passée de 55% à 57% (+2%)
- Quand je clique sur "Unlike"
- Alors ma jauge "Sport" diminue de 2%
- Et ma jauge "Sport" revient Ă 55%
-
- Scénario: Unlike ne peut pas retirer un like automatique
- Ătant donnĂ© que j'ai Ă©coutĂ© un contenu "Musique" Ă 90%
- Et que j'ai reçu un like automatique renforcé (+2%)
- Et que ma jauge "Musique" est Ă 52%
- Quand j'essaie de faire "Unlike"
- Alors l'action n'est pas disponible
- Et ma jauge reste Ă 52%
- Car les likes automatiques ne peuvent pas ĂȘtre retirĂ©s
-
- Scénario: Tags définis par créateur à la publication
- Ătant donnĂ© que je suis un crĂ©ateur
- Quand je publie un contenu
- Alors je dois sélectionner 1 à 3 tags
- Et ces tags sont fixés aprÚs publication
- Et impacteront les jauges de tous les auditeurs
-
- Plan du Scénario: Calculs avec différentes durées d'écoute
- Ătant donnĂ© qu'un contenu de 10 minutes est taguĂ© "Voyage"
- Et que ma jauge "Voyage" est Ă 50%
- Quand j'écoute pendant ()
- Alors ma jauge évolue de
- Et ma nouvelle jauge est Ă
-
- Exemples:
- | duree | pourcentage | impact | nouveau_niveau |
- | 1 min | 10% | 0% | 50% |
- | 3 min | 30% | +1% | 51% |
- | 5 min | 50% | +1% | 51% |
- | 7.9 min | 79% | +1% | 51% |
- | 8 min | 80% | +2% | 52% |
- | 9.5 min | 95% | +2% | 52% |
- | 5 sec | <1% | -0.5% | 49.5% |
diff --git a/features/ui/interest-gauges/jauge-initiale.feature b/features/ui/interest-gauges/jauge-initiale.feature
deleted file mode 100644
index 11a69d6..0000000
--- a/features/ui/interest-gauges/jauge-initiale.feature
+++ /dev/null
@@ -1,147 +0,0 @@
-# language: fr
-Fonctionnalité: Jauge initiale et cold start
- En tant que nouvel utilisateur
- Je veux que mes jauges d'intĂ©rĂȘt dĂ©marrent de maniĂšre neutre
- Afin de découvrir du contenu sans biais initial
-
- Contexte:
- Ătant donnĂ© que l'API RoadWave est disponible
-
- Scénario: Inscription - toutes les jauges à 50%
- Quand je m'inscris sur RoadWave
- Alors toutes mes jauges d'intĂ©rĂȘt sont initialisĂ©es Ă 50%
- Et je ne dois pas remplir de questionnaire
- Et l'inscription est ultra-rapide
-
- Scénario: Liste des catégories disponibles
- Ătant donnĂ© que je suis un nouvel utilisateur
- Quand je consulte mes centres d'intĂ©rĂȘt
- Alors je vois les catégories suivantes à 50%:
- | catégorie |
- | Automobile |
- | Voyage |
- | Famille |
- | Amour |
- | Musique |
- | Ăconomie |
- | Cryptomonnaie |
- | Politique |
- | Culture générale |
- | Sport |
- | Technologie |
- | Santé |
-
- Scénario: Cold start - premier contenu écouté
- Ătant donnĂ© que je viens de m'inscrire
- Et que toutes mes jauges sont Ă 50%
- Quand j'écoute mon premier podcast "Automobile" à 90%
- Alors ma jauge "Automobile" monte Ă 52% (+2%)
- Et toutes les autres jauges restent Ă 50%
-
- Scénario: Cold start - premier skip
- Ătant donnĂ© que je viens de m'inscrire
- Et que toutes mes jauges sont Ă 50%
- Quand je skip rapidement un contenu "Ăconomie"
- Alors ma jauge "Ăconomie" descend Ă 49.5% (-0.5%)
- Et toutes les autres jauges restent Ă 50%
-
- Scénario: AprÚs 10 écoutes, profil commence à se dessiner
- Ătant donnĂ© que je suis un nouvel utilisateur
- Et que j'ai écouté:
- | contenu | tags | completion |
- | Contenu 1 | Automobile | 90% |
- | Contenu 2 | Automobile, Sport | 85% |
- | Contenu 3 | Voyage | 75% |
- | Contenu 4 | Ăconomie | skip 5s |
- | Contenu 5 | Automobile | 95% |
- | Contenu 6 | Sport | 80% |
- | Contenu 7 | Politique | skip 8s |
- | Contenu 8 | Voyage | 88% |
- | Contenu 9 | Automobile | 92% |
- | Contenu 10 | Technologie | 40% |
- Alors mes jauges reflÚtent mes préférences:
- | catégorie | tendance |
- | Automobile | Forte hausse (>55%) |
- | Voyage | Hausse modérée (~53%) |
- | Sport | Hausse modérée (~53%) |
- | Ăconomie | Baisse lĂ©gĂšre (~49.5%) |
- | Politique | Baisse légÚre (~49.5%) |
- | Technologie | Neutre (~51%) |
-
- Scénario: Pas de questionnaire onboarding par défaut
- Quand je termine l'inscription
- Alors aucun questionnaire de centres d'intĂ©rĂȘt n'est affichĂ©
- Et je peux commencer à écouter immédiatement
- Et l'algorithme apprend naturellement
-
- Scénario: Algorithme avec jauges à 50% - chances égales
- Ătant donnĂ© que toutes mes jauges sont Ă 50%
- Quand l'algorithme calcule les recommandations
- Alors tous les types de contenus ont une chance égale
- Et aucun biais initial n'est appliqué
- Et la gĂ©olocalisation prime sur les intĂ©rĂȘts
-
- Scénario: Questionnaire optionnel aprÚs 3 écoutes (post-MVP)
- Ătant donnĂ© que j'ai Ă©coutĂ© 3 contenus
- Quand je termine ma 3Úme écoute
- Alors je vois une notification in-app optionnelle:
- | titre | Améliorez vos recommandations |
- | message | SĂ©lectionnez vos centres d'intĂ©rĂȘt |
- | actions | Configurer maintenant / Plus tard |
-
- Scénario: Remplir le questionnaire optionnel (post-MVP)
- Ătant donnĂ© que le questionnaire optionnel est affichĂ©
- Quand je sĂ©lectionne les centres d'intĂ©rĂȘt suivants:
- | catégorie |
- | Automobile |
- | Voyage |
- | Sport |
- Alors les jauges sélectionnées passent à 70%
- Et les jauges non sélectionnées passent à 30%
- Et je vois le message "Vos préférences ont été enregistrées"
-
- Scénario: Skipper le questionnaire optionnel (post-MVP)
- Ătant donnĂ© que le questionnaire optionnel est affichĂ©
- Quand je clique sur "Plus tard"
- Alors toutes mes jauges conservent 50%
- Et l'algorithme continue d'apprendre naturellement
- Et je ne suis plus sollicité
-
- Scénario: Comportement déterministe et testable
- Ătant donnĂ© deux nouveaux utilisateurs A et B
- Quand les deux s'inscrivent au mĂȘme moment
- Alors leurs jauges sont identiques (toutes Ă 50%)
- Et leurs recommandations initiales sont identiques (basées sur géo uniquement)
-
- ScĂ©nario: ĂquitĂ© entre crĂ©ateurs au cold start
- Ătant donnĂ© qu'un nouvel utilisateur s'inscrit
- Et qu'il existe 1000 contenus de catégories variées dans sa zone
- Quand l'algorithme génÚre les premiÚres recommandations
- Alors tous les contenus ont une pondĂ©ration intĂ©rĂȘts identique (50%)
- Et seuls la géolocalisation et l'engagement différencient les contenus
- Et aucun créateur n'a d'avantage initial
-
- Scénario: Catégories extensibles
- Ătant donnĂ© que RoadWave ajoute une nouvelle catĂ©gorie "Gastronomie"
- Quand je consulte mes centres d'intĂ©rĂȘt
- Alors je vois la nouvelle catégorie "Gastronomie" à 50%
- Et je peux commencer Ă l'explorer normalement
-
- Scénario: Voir l'évolution de mes jauges
- Ătant donnĂ© que je suis un utilisateur avec historique
- Quand je consulte mes centres d'intĂ©rĂȘt dans les paramĂštres
- Alors je vois mes jauges actuelles:
- | catégorie | niveau | evolution |
- | Automobile | 67% | +17% |
- | Voyage | 82% | +32% |
- | Ăconomie | 34% | -16% |
- | Sport | 50% | 0% |
- Et je comprends mes préférences actuelles
-
- Scénario: Friction zéro à l'inscription
- Ătant donnĂ© que je veux m'inscrire rapidement
- Quand je remplis les 4 champs obligatoires
- Et que je clique sur "S'inscrire"
- Alors mon compte est créé immédiatement
- Et je peux commencer à écouter dans les 30 secondes
- Et aucune configuration supplémentaire n'est requise
diff --git a/features/ui/recommendation/filtrage-politique-ui.feature b/features/ui/recommendation/filtrage-politique-ui.feature
deleted file mode 100644
index f394805..0000000
--- a/features/ui/recommendation/filtrage-politique-ui.feature
+++ /dev/null
@@ -1,234 +0,0 @@
-# language: fr
-Fonctionnalité: UI - Filtrage contenu politique
- En tant qu'utilisateur
- Je veux contrĂŽler mon exposition au contenu politique
- Afin d'adapter mon expérience selon mes préférences
-
- Contexte:
- Ătant donnĂ© que l'application RoadWave est ouverte
- Et que je suis connecté
-
- Scénario: Accéder aux paramÚtres de contenu politique
- Quand j'ouvre les paramĂštres
- Et que je clique sur "Contenu politique"
- Alors je vois l'écran "Gestion du contenu politique"
- Et je vois trois options:
- | option | icĂŽne | description |
- | Masquer | đ« | 0% de contenus politiques |
- | ĂquilibrĂ© | âïž | Selon vos intĂ©rĂȘts (dĂ©faut) |
- | Mes prĂ©fĂ©rences | â€ïž | BasĂ© sur votre jauge "Politique" |
-
- ScĂ©nario: Option "ĂquilibrĂ©" par dĂ©faut
- Ătant donnĂ© que je suis un nouvel utilisateur
- Quand je consulte les paramĂštres de contenu politique
- Alors l'option "ĂquilibrĂ©" est sĂ©lectionnĂ©e par dĂ©faut
- Et je vois "(Recommandé)" à cÎté
- Et je vois la description:
- """
- Les contenus politiques sont recommandés selon
- l'algorithme standard (intĂ©rĂȘts, gĂ©o, engagement)
-
- Votre jauge "Politique" actuelle: 50%
- """
-
- Scénario: Sélectionner l'option "Masquer"
- Ătant donnĂ© que l'option "ĂquilibrĂ©" est active
- Quand je clique sur le bouton radio "Masquer"
- Alors l'option "Masquer" est sélectionnée
- Et je vois l'icĂŽne đ« "Aucun contenu politique"
- Et je vois un message de confirmation:
- """
- Tous les contenus tagués "Politique" seront
- exclus de vos recommandations.
-
- Vous ne verrez aucun contenu politique.
- """
- Et je vois "Sauvegarder" en bas de l'écran
-
- Scénario: Sauvegarder l'option "Masquer"
- Ătant donnĂ© que j'ai sĂ©lectionnĂ© "Masquer"
- Quand je clique sur "Sauvegarder"
- Alors je vois une animation de confirmation
- Et je vois "Contenu politique masquĂ© â"
- Et je retourne à l'écran précédent
- Et un badge "đ« Politique" apparaĂźt sur l'Ă©cran principal (optionnel)
-
- Scénario: Badge indicateur sur l'écran principal
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je retourne à l'écran principal
- Alors je vois un petit badge "đ«" en haut
- Et en tapant dessus, je vois "Contenu politique masqué"
- Et je peux accéder rapidement aux paramÚtres
-
- Scénario: Recommandations sans contenu politique
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je consulte mes recommandations
- Alors je ne vois aucun contenu tagué "Politique"
- Et je vois "Filtré: Politique masqué" en bas de l'écran
- Et tous les contenus affichés n'ont pas le tag "Politique"
-
- Scénario: Sélectionner l'option "Mes préférences"
- Quand je clique sur le bouton radio "Mes préférences"
- Alors l'option "Mes préférences" est sélectionnée
- Et je vois l'icĂŽne â€ïž "Selon votre jauge"
- Et je vois:
- """
- Les contenus politiques seront recommandés
- selon votre jauge "Politique"
-
- Votre jauge actuelle: 45%
- Plus vous écoutez de contenu politique, plus
- vous en recevrez de recommandations.
- """
-
- Scénario: Recherche avec filtrage politique actif
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je recherche "actualités France"
- Alors les résultats excluent les contenus tagués "Politique"
- Et je vois "Résultats filtrés (Politique masqué)"
-
- Scénario: Recherche explicite contenu politique malgré filtre
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je recherche en filtrant par tag "Politique"
- Alors les contenus politiques sont affichés
- Et je vois un avertissement:
- """
- â ïž Recherche explicite de contenu politique
-
- Vos paramĂštres masquent ce type de contenu,
- mais vous avez fait une recherche explicite.
- """
-
- Scénario: Partage de contenu politique avec filtre actif
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Et qu'un ami me partage un lien vers un contenu politique
- Quand j'ouvre le lien
- Alors je vois un avertissement:
- """
- đ« Contenu politique
-
- Ce contenu est tagué "Politique" et est
- normalement masqué par vos paramÚtres.
-
- Voulez-vous l'Ă©couter quand mĂȘme?
- """
- Et je peux choisir "Ăcouter" ou "Retour"
-
- Scénario: Confirmer l'écoute de contenu politique partagé
- Ătant donnĂ© que je vois l'avertissement de contenu politique partagĂ©
- Quand je clique sur "Ăcouter"
- Alors le contenu se lance normalement
- Et je vois le tag "Politique" bien visible
- Et le contenu ne réactive pas le filtrage politique
-
- Scénario: Désactiver le filtrage politique
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je retourne aux paramĂštres de contenu politique
- Et que je sĂ©lectionne "ĂquilibrĂ©"
- Et que je sauvegarde
- Alors le filtrage est levé
- Et je vois "Contenu politique Ă nouveau visible"
- Et le badge "đ«" disparaĂźt de l'Ă©cran principal
-
- Scénario: Statistiques sur contenu politique masqué
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique" depuis 30 jours
- Quand je consulte mes statistiques
- Alors je vois:
- | métrique | valeur |
- | Contenus politiques masqués | 142 |
- | Depuis | 30 j |
- | Contenus écoutés sans politique| 85 |
-
- Scénario: Notification de contenu politique disponible
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Et qu'un événement politique majeur se produit dans ma région
- Quand RoadWave a des contenus pertinents tagués "Politique"
- Alors je reçois une notification optionnelle:
- """
- đ° ActualitĂ©s locales importantes
-
- Des contenus politiques pertinents sont disponibles
- dans votre zone.
-
- Vos paramĂštres masquent ce type de contenu.
- Modifier les paramĂštres?
- """
- Et je peux ignorer ou modifier mes paramĂštres
-
- Scénario: Mode Kids force le masquage politique
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je consulte les paramĂštres de contenu politique
- Alors l'option "Masquer" est sélectionnée et verrouillée
- Et je vois "(Forcé par Mode Kids)"
- Et je ne peux pas modifier ce paramĂštre
- Et les autres options sont grisées
-
- Scénario: Désactiver Mode Kids déverrouille filtrage politique
- Ătant donnĂ© que le Mode Kids est activĂ©
- Et que le filtrage politique est forcé
- Quand je désactive le Mode Kids
- Alors les options de filtrage politique sont déverrouillées
- Et je peux sĂ©lectionner "ĂquilibrĂ©" ou "Mes prĂ©fĂ©rences"
-
- Scénario: Jauge "Politique" visible dans les paramÚtres
- Ătant donnĂ© que je suis sur l'Ă©cran de contenu politique
- Et que l'option "Mes préférences" est sélectionnée
- Quand je consulte ma jauge "Politique"
- Alors je vois une barre de progression: ââââââââââ 45%
- Et je vois "Plus vous écoutez, plus votre jauge augmente"
-
- Scénario: Impact du filtrage sur les recommandations
- Ătant donnĂ© que j'ai activĂ© "Masquer contenu politique"
- Quand je consulte mes recommandations
- Alors je vois "12 contenus disponibles (Politique masqué)"
- Et je sais combien de contenus sont exclus
-
- Scénario: Créer profil avec filtrage politique personnalisé
- Ătant donnĂ© que je crĂ©e un profil "đ Trajet quotidien"
- Quand je configure le paramĂštre "Politique" sur "Masquer"
- Alors ce profil masque automatiquement le contenu politique
- Quand je crĂ©e un profil "đŁïž Road trip"
- Et que je configure "Politique" sur "ĂquilibrĂ©"
- Alors ce profil affiche le contenu politique selon l'algorithme
-
- Scénario: Switch entre profils avec paramÚtres politiques différents
- Ătant donnĂ© que le profil "Trajet quotidien" masque le contenu politique
- Et que le profil "Road trip" affiche le contenu politique
- Quand je passe de "Trajet quotidien" Ă "Road trip"
- Alors le contenu politique réapparaßt dans les recommandations
- Et je vois "Contenu politique visible (profil Road trip)"
-
- Scénario: Tooltip explicatif sur les options
- Quand je tape sur l'icĂŽne âčïž Ă cĂŽtĂ© de "ĂquilibrĂ©"
- Alors je vois un tooltip:
- """
- ĂquilibrĂ© (RecommandĂ©)
-
- Les contenus politiques sont recommandés comme
- tout autre contenu, selon l'algorithme standard.
-
- Votre jauge "Politique" évolue naturellement
- selon vos écoutes.
- """
-
- Scénario: Message MVP - pas de classification gauche/droite
- Quand je consulte l'écran de contenu politique
- Alors je vois en bas:
- """
- âčïž Version MVP
-
- Actuellement, les contenus sont simplement tagués
- "Politique" sans classification gauche/droite.
-
- Des options avancées seront disponibles dans
- une future version.
- """
-
- Scénario: Export RGPD inclut historique filtrage politique
- Ătant donnĂ© que j'ai modifiĂ© mes paramĂštres politiques 3 fois
- Quand je demande l'export RGPD
- Alors l'export inclut:
- | information | inclus |
- | Historique paramĂštre politique| â
|
- | Dates de modification | â
|
- | Contenus politiques masquĂ©s | â
|
diff --git a/features/ui/recommendation/mode-kids-ui.feature b/features/ui/recommendation/mode-kids-ui.feature
deleted file mode 100644
index 1bcb064..0000000
--- a/features/ui/recommendation/mode-kids-ui.feature
+++ /dev/null
@@ -1,261 +0,0 @@
-# language: fr
-Fonctionnalité: UI - Mode Kids pour utilisateurs 13-15 ans
- En tant que parent ou adolescent
- Je veux activer et utiliser le Mode Kids facilement
- Afin de protéger les mineurs des contenus inappropriés
-
- Contexte:
- Ătant donnĂ© que l'application RoadWave est ouverte
- Et que je suis connecté
-
- Scénario: Activer le Mode Kids depuis les paramÚtres
- Ătant donnĂ© que je suis un utilisateur de 14 ans
- Et que le Mode Kids n'est pas activé
- Quand j'ouvre les paramĂštres
- Et que je clique sur "Mode Kids"
- Alors je vois l'écran "Mode Kids"
- Et je vois un toggle désactivé
- Et je vois une description:
- """
- Mode Kids (13-15 ans)
-
- Filtrage automatique:
- â Uniquement contenus "Tous publics"
- â Exclusion contenus 16+ et 18+
- â Pas de contenu politique
- â Aucune publicitĂ©
-
- Interface standard, filtrage intelligent.
- """
-
- Scénario: Activer le toggle Mode Kids
- Ătant donnĂ© que je suis sur l'Ă©cran Mode Kids
- Quand je bascule le toggle sur "Activé"
- Alors je vois une animation de confirmation
- Et le toggle devient vert
- Et je vois le message "Mode Kids activĂ© - Contenus filtrĂ©s pour 13-15 ans â"
- Et un badge "đĄïž Mode Kids" apparaĂźt sur l'Ă©cran principal
-
- Scénario: Badge Mode Kids visible sur l'écran principal
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je retourne à l'écran principal
- Alors je vois un badge "đĄïž Mode Kids" en haut Ă droite
- Et ce badge est bien visible
- Et je peux taper dessus pour accéder rapidement aux paramÚtres
-
- Scénario: Notification aprÚs activation Mode Kids
- Quand j'active le Mode Kids
- Alors je vois une notification détaillée:
- """
- Mode Kids activĂ© đĄïž
-
- â Contenus "Tous publics" uniquement
- â Contenus politiques masquĂ©s
- â Aucune publicitĂ©
-
- Vous pouvez désactiver ce mode à tout moment
- dans les paramĂštres.
- """
- Et je peux cliquer sur "Compris"
-
- Scénario: Filtrage visuel des contenus en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je consulte les recommandations
- Alors je ne vois que des contenus avec le badge "Tous publics â"
- Et aucun contenu 13+, 16+, ou 18+ n'est affiché
- Et je vois "Filtré par Mode Kids" en bas de l'écran
-
- Scénario: Tentative d'accÚs à un contenu 16+ via lien partagé
- Ătant donnĂ© que le Mode Kids est activĂ©
- Et qu'un ami me partage un lien vers un contenu 16+
- Quand j'ouvre le lien
- Alors je vois un écran de blocage:
- """
- đĄïž Contenu non accessible
-
- Ce contenu est classé 16+ et n'est pas
- accessible en Mode Kids.
-
- Désactivez le Mode Kids dans les paramÚtres
- pour accéder à ce contenu.
- """
- Et je vois un bouton "Retour"
- Et je ne peux pas accéder au contenu
-
- Scénario: Recherche filtrée en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je recherche "débat politique"
- Alors seuls les contenus "Tous publics" apparaissent
- Et je vois "Résultats filtrés (Mode Kids actif)"
- Et les contenus politiques ou 16+ sont exclus
-
- Scénario: Aucune publicité en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Et que je suis un utilisateur gratuit
- Quand j'écoute plusieurs contenus
- Alors aucune publicité n'est diffusée
- Et je ne vois aucune interruption publicitaire
- Et je vois "Ăcoute sans publicitĂ© (Mode Kids)" dans les paramĂštres
-
- Scénario: Désactiver le Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand j'ouvre les paramĂštres Mode Kids
- Et que je bascule le toggle sur "Désactivé"
- Alors je vois une confirmation "Désactiver le Mode Kids?"
- Et je vois "Tous les contenus seront Ă nouveau accessibles"
- Quand je confirme
- Alors le Mode Kids est désactivé
- Et le badge "đĄïž Mode Kids" disparaĂźt
- Et je vois "Mode Kids désactivé"
-
- Scénario: Parent active Mode Kids pour son enfant
- Ătant donnĂ© que je suis le parent d'un utilisateur de 13 ans
- Et que j'ai accĂšs au compte de mon enfant via contrĂŽle parental
- Quand j'active le Mode Kids
- Et que je définis un code PIN parental
- Alors le Mode Kids est activé sur le compte enfant
- Et seul le code PIN peut le désactiver
-
- Scénario: Enfant essaie de désactiver Mode Kids avec PIN parental
- Ătant donnĂ© que le Mode Kids est activĂ© avec PIN parental
- Quand mon enfant essaie de désactiver le Mode Kids
- Alors il voit un écran "Code PIN parental requis"
- Et il doit saisir le code PIN Ă 4 chiffres
- Si le code est incorrect
- Alors je vois "Code incorrect" et le Mode Kids reste actif
-
- Scénario: Code PIN correct désactive le Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ© avec PIN parental
- Quand je saisis le code PIN correct
- Alors le Mode Kids peut ĂȘtre dĂ©sactivĂ©
- Et je vois "Mode Kids désactivé (autorisé par parent)"
-
- Scénario: Profil "Enfants" avec Mode Kids automatique
- Ătant donnĂ© que je crĂ©e un profil "đ¶ Enfants"
- Quand j'active le Mode Kids dans ce profil
- Alors le profil active automatiquement le Mode Kids
- Et tous les autres paramÚtres sont forcés:
- | paramĂštre | valeur |
- | Politique | Masquer (verrouillé) |
- | Publicité | Aucune (verrouillé) |
-
- Scénario: Switch entre profil normal et profil Kids
- Ătant donnĂ© que j'ai un profil "Road trip" (normal)
- Et un profil "Enfants" (Mode Kids)
- Quand je passe du profil "Road trip" Ă "Enfants"
- Alors le Mode Kids s'active automatiquement
- Et je vois "Mode Kids activĂ© đĄïž"
- Quand je repasse Ă "Road trip"
- Alors le Mode Kids se désactive
- Et je vois "Mode Kids désactivé"
-
- Scénario: Audio-guide accessible en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Et qu'un audio-guide "Tous publics" existe au Louvre
- Quand je suis à proximité du Louvre
- Alors l'audio-guide est proposé normalement
- Et toutes les séquences "Tous publics" sont accessibles
- Et je vois le badge "Tous publics â"
-
- Scénario: Statistiques d'écoute en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je consulte mes statistiques
- Alors je vois:
- | métrique | valeur |
- | Contenus écoutés (Mode Kids) | 45 |
- | Heures d'écoute | 23h |
- | Catégories favorites | Culture |
- Et je vois "Mode Kids actif depuis le 15/01/2026"
-
- Scénario: Notification pour contenu inapproprié détecté
- Ătant donnĂ© que le Mode Kids est activĂ©
- Et qu'un contenu classé "Tous publics" contient du langage inapproprié signalé
- Quand je commence l'écoute
- Alors je vois un avertissement "Contenu signalé par la communauté"
- Et je peux choisir "Continuer" ou "Passer"
-
- Scénario: Interface visuelle identique en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je navigue dans l'app
- Alors l'interface est identique au mode normal
- Et il n'y a pas d'interface "enfant" spéciale
- Et seul le filtrage de contenu est actif
- Et le badge "đĄïž Mode Kids" indique le mode actif
-
- Scénario: Badge "Tous publics" sur les contenus
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je consulte les détails d'un contenu
- Alors je vois clairement le badge "Tous publics â"
- Et la classification d'Ăąge est bien visible
- Et je sais que le contenu est adapté
-
- Scénario: Onglet "Mode Kids" dans paramÚtres
- Quand j'ouvre les paramĂštres
- Alors je vois un onglet dédié "Mode Kids"
- Et il est bien visible
- Et je peux y accéder rapidement
-
- Scénario: Activer Mode Kids depuis un profil
- Ătant donnĂ© que je crĂ©e un nouveau profil
- Quand je vois l'option "Activer Mode Kids pour ce profil"
- Et que je l'active
- Alors le Mode Kids est lié à ce profil uniquement
- Et se désactive automatiquement quand je change de profil
-
- Scénario: Compteur de contenus disponibles en Mode Kids
- Ătant donnĂ© que le Mode Kids est activĂ©
- Quand je consulte l'écran Mode Kids dans les paramÚtres
- Alors je vois "~2,450 contenus 'Tous publics' disponibles dans votre zone"
- Et je sais qu'il y a suffisamment de contenu
-
- Scénario: Message explicatif pour utilisateurs 16+
- Ătant donnĂ© que je suis un utilisateur de 18 ans
- Quand j'active le Mode Kids
- Alors je vois un message:
- """
- Mode Kids activé
-
- MĂȘme si vous avez plus de 15 ans, ce mode
- filtre les contenus 16+ et 18+.
-
- Seuls les contenus "Tous publics" seront accessibles.
- """
-
- Scénario: Désactivation automatique à 16 ans (optionnel)
- Ătant donnĂ© que je suis un utilisateur de 15 ans
- Et que le Mode Kids est activé
- Quand j'atteins 16 ans (anniversaire)
- Alors je reçois une notification:
- """
- đ Joyeux anniversaire!
-
- Vous avez maintenant 16 ans.
- Le Mode Kids peut ĂȘtre dĂ©sactivĂ© si vous le souhaitez.
-
- Accédez à tous les contenus adaptés à votre ùge.
- """
- Et je peux choisir de garder ou désactiver le Mode Kids
-
- Scénario: Export données RGPD inclut historique Mode Kids
- Ătant donnĂ© que le Mode Kids a Ă©tĂ© activĂ© pendant 6 mois
- Quand je demande l'export RGPD
- Alors l'export inclut:
- | information | inclus |
- | Historique Mode Kids | â
|
- | Dates activation/dĂ©sactiv.| â
|
- | Contenus Ă©coutĂ©s filtrĂ©s | â
|
-
- Scénario: Onboarding Mode Kids pour nouveaux utilisateurs 13-15 ans
- Ătant donnĂ© que je m'inscris Ă RoadWave
- Et que j'ai 14 ans
- Quand je termine l'inscription
- Alors je vois un écran de bienvenue:
- """
- Bienvenue sur RoadWave! đ
-
- Nous avons détecté que vous avez 14 ans.
-
- Souhaitez-vous activer le Mode Kids?
- Filtrage automatique pour contenus adaptés.
- """
- Et je peux choisir "Activer" ou "Plus tard"
diff --git a/features/ui/recommendation/notifications-geo.feature b/features/ui/recommendation/notifications-geo.feature
deleted file mode 100644
index 98d25a1..0000000
--- a/features/ui/recommendation/notifications-geo.feature
+++ /dev/null
@@ -1,256 +0,0 @@
-# language: fr
-Fonctionnalité: UI - Notifications géographiques
- En tant qu'utilisateur
- Je veux recevoir des notifications lors du passage prĂšs d'un point d'intĂ©rĂȘt
- Afin de découvrir du contenu géolocalisé pertinent
-
- Contexte:
- Ătant donnĂ© que l'application RoadWave est ouverte
- Et que je suis connecté
- Et que la géolocalisation est activée
-
- Scénario: Notification au passage <500m d'un point GPS
- Ătant donnĂ© qu'un contenu "gĂ©o-ancrĂ©" existe au Louvre
- Et que j'écoute un podcast en cours
- Quand je passe Ă 400m du point GPS du Louvre
- Alors j'entends un bip court (notification sonore)
- Et je vois une notification visuelle apparaĂźtre
- Et la notification affiche:
- | élément | valeur |
- | Logo | đïž (Culturel) |
- | Titre | "Histoire du Louvre" |
- | Distance | "Ă 400m" |
- | Durée | "12 min" |
- Et je dispose de 5 secondes pour réagir
-
- Scénario: Types de logos selon le contenu
- Plan du Scénario: Logo selon le type de contenu
- Ătant donnĂ© qu'un contenu de type "" existe Ă proximitĂ©
- Quand je reçois la notification
- Alors je vois le logo ""
-
- Exemples:
- | type | logo |
- | Info | đ |
- | Culturel | đïž |
- | Commercial | đŽ |
- | ĂvĂ©nement | đ |
-
- Scénario: Accepter la notification - lecture immédiate
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand je clique sur "Ăcouter" dans les 5 secondes
- Alors le contenu en cours s'arrĂȘte
- Et le nouveau contenu se lance immédiatement
- Et je vois "Lecture: Histoire du Louvre"
-
- Scénario: Accepter via bouton au volant
- Ătant donnĂ© que je reçois une notification gĂ©o
- Et que je conduis
- Quand j'appuie sur le bouton "Suivant" de mon volant
- Alors le contenu géolocalisé se lance
- Et je n'ai pas besoin de toucher l'écran
-
- Scénario: Accepter via commande vocale
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand je dis "Ăcouter"
- Alors le contenu géolocalisé se lance immédiatement
- Et je garde les mains sur le volant
-
- Scénario: Ignorer la notification - délai 5 secondes
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand je ne fais rien pendant 5 secondes
- Alors la notification disparaĂźt automatiquement
- Et le contenu en cours continue normalement
- Et le contenu géo est ajouté à la file d'attente
-
- Scénario: Notification ajoutée à la file si ignorée
- Ătant donnĂ© que j'ignore une notification gĂ©o
- Quand je consulte ma file d'attente
- Alors je vois le contenu "Histoire du Louvre" dans la liste
- Et je peux l'écouter plus tard
-
- Scénario: Notification publicitaire - son différent
- Ătant donnĂ© qu'une publicitĂ© gĂ©olocalisĂ©e existe Ă proximitĂ©
- Quand je passe Ă <500m
- Alors j'entends un son différent (optionnel selon paramÚtres)
- Et je vois le logo đŽ "Restaurant local"
- Et je vois "(Publicité)" bien visible
- Et je peux accepter ou ignorer comme un contenu normal
-
- Scénario: Publicité ne coupe jamais le contenu en cours
- Ătant donnĂ© que j'Ă©coute un podcast
- Et qu'une pub géolocalisée existe à proximité
- Quand je reçois la notification pub
- Alors le podcast en cours continue sans interruption
- Et la pub s'intercalera uniquement entre deux séquences si acceptée
-
- Scénario: Gestion du demi-tour - pas de re-notification
- Ătant donnĂ© que j'ai reçu une notification pour le Louvre
- Et que j'ai ignoré la notification
- Quand je fais demi-tour et repasse Ă <500m du Louvre
- Alors je ne reçois pas de nouvelle notification
- Et le contenu reste dans la file d'attente
-
- Scénario: Réinitialisation aprÚs 24h
- Ătant donnĂ© que j'ai ignorĂ© une notification pour le Louvre
- Et que 24 heures se sont écoulées
- Quand je repasse Ă <500m du Louvre
- Alors je reçois à nouveau la notification
- Et je peux choisir de l'écouter
-
- Scénario: Notification visuelle discrÚte en mode conduite
- Ătant donnĂ© que je conduis Ă 50 km/h
- Quand je reçois une notification géo
- Alors la notification apparaßt en bas de l'écran
- Et elle est discrĂšte pour ne pas distraire
- Et le texte est lisible rapidement
- Et l'animation est fluide
-
- Scénario: Compteur de temps restant pour accepter
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand la notification s'affiche
- Alors je vois un compteur circulaire "5...4...3...2...1"
- Et le cercle se vide progressivement
- Et je sais combien de temps il me reste
-
- Scénario: Balayer pour ignorer rapidement
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand je balaye la notification vers la droite
- Alors la notification disparaßt immédiatement
- Et le contenu est ajouté à la file d'attente
- Et je vois "Ajouté à la file d'attente"
-
- Scénario: Balayer pour accepter rapidement
- Ătant donnĂ© que je reçois une notification gĂ©o
- Quand je balaye la notification vers la gauche
- Alors le contenu se lance immédiatement
- Et je vois "Lecture: Histoire du Louvre"
-
- Scénario: Désactiver les notifications géo dans les paramÚtres
- Ătant donnĂ© que je suis dans les paramĂštres
- Quand je désactive "Notifications géolocalisées"
- Alors je ne reçois plus de notifications au passage de points GPS
- Mais les contenus géo restent recommandés normalement dans la file
-
- Scénario: Régler le rayon de déclenchement
- Ătant donnĂ© que je suis dans les paramĂštres avancĂ©s
- Quand je modifie "Rayon de notification" de 500m Ă 1000m
- Alors les notifications se déclenchent à 1000m au lieu de 500m
- Et je reçois les notifications plus tÎt
-
- Scénario: Désactiver le son des notifications
- Ătant donnĂ© que je suis dans les paramĂštres audio
- Quand je désactive "Son des notifications géo"
- Alors je reçois uniquement les notifications visuelles
- Et aucun bip n'est joué
-
- Scénario: Désactiver uniquement les pubs géolocalisées
- Ătant donnĂ© que je suis dans les paramĂštres
- Quand je désactive "Publicités géolocalisées"
- Alors je ne reçois plus de notifications pour les pubs
- Mais je reçois toujours les notifications pour les contenus organiques
-
- Scénario: Notification en mode piéton
- Ătant donnĂ© que je suis en mode piĂ©ton (vitesse < 5 km/h)
- Quand je passe Ă <500m d'un point GPS
- Alors je reçois la notification normalement
- Et la notification peut ĂȘtre plus dĂ©taillĂ©e (mode piĂ©ton)
- Et je vois une miniature du contenu
-
- Scénario: Notification en mode voiture
- Ătant donnĂ© que je conduis Ă 70 km/h
- Quand je reçois une notification géo
- Alors la notification est ultra-simplifiée
- Et je vois uniquement: Logo + Titre + "Ăcouter"
- Et l'interface est adaptée à la conduite
-
- Scénario: Historique des notifications ignorées
- Ătant donnĂ© que j'ai ignorĂ© 5 notifications gĂ©o aujourd'hui
- Quand je consulte "Historique notifications"
- Alors je vois la liste des 5 notifications ignorées:
- | contenu | heure | lieu |
- | Histoire du Louvre | 14:30 | Paris 1er |
- | Restaurant local | 15:00 | Paris 8e |
- | Musée d'Orsay | 15:45 | Paris 7e |
- Et je peux les écouter depuis l'historique
-
- Scénario: Notification avec aperçu vocal (optionnel)
- Ătant donnĂ© que j'ai activĂ© "Aperçu vocal" dans les paramĂštres
- Quand je reçois une notification géo
- Alors aprĂšs le bip, j'entends: "Histoire du Louvre, 12 minutes, Ă 400 mĂštres"
- Et je peux accepter vocalement en disant "Ăcouter"
-
- Scénario: Plusieurs notifications en cascade
- Ătant donnĂ© que je suis dans une zone dense (Paris)
- Et qu'il y a 3 contenus géo-ancrés dans un rayon de 500m
- Quand je passe à proximité
- Alors je reçois la notification du contenu le plus proche en premier
- Et les autres notifications sont espacées de 30 secondes minimum
- Et je ne suis pas submergé de notifications
-
- Scénario: Priorisation des notifications par pertinence
- Ătant donnĂ© que 2 contenus sont Ă proximitĂ©:
- | contenu | distance | score_intĂ©rĂȘts |
- | Audio-guide A | 300m | 0.9 |
- | Podcast B | 250m | 0.3 |
- Quand je dois recevoir une notification
- Alors "Audio-guide A" est notifié en premier (score plus élevé)
- MĂȘme si "Podcast B" est plus proche
-
- Scénario: Notification lors d'une pause
- Ătant donnĂ© que j'ai mis en pause mon contenu
- Quand je passe Ă <500m d'un point GPS
- Alors je reçois la notification normalement
- Et si j'accepte, le nouveau contenu se lance
- Et l'ancien contenu en pause reste en pause
-
- ScĂ©nario: Carte avec points d'intĂ©rĂȘt Ă proximitĂ©
- Ătant donnĂ© que je consulte l'Ă©cran "Carte"
- Quand je zoome sur ma position
- Alors je vois des marqueurs pour tous les contenus géo-ancrés à <5km
- Et chaque marqueur affiche le logo du type de contenu
- Et je peux taper sur un marqueur pour voir les détails
-
- Scénario: Prévisualiser les notifications à venir sur itinéraire
- Ătant donnĂ© que j'ai saisi un itinĂ©raire dans GPS
- Quand je consulte "Contenus sur votre route"
- Alors je vois la liste des contenus géo qui seront notifiés:
- | contenu | dans | type |
- | Histoire du Louvre | 5 min | đïž Culturel |
- | Restaurant local | 12min | đŽ Commercial|
- Et je peux pré-écouter ou ignorer d'avance
-
- Scénario: Annuler une notification en cours
- Ătant donnĂ© qu'une notification gĂ©o s'affiche
- Et que le compteur est Ă 3 secondes
- Quand je tape sur â "Fermer"
- Alors la notification disparaßt immédiatement
- Et le contenu est ajouté à la file d'attente
-
- Scénario: Badge compteur de notifications ignorées
- Ătant donnĂ© que j'ai ignorĂ© 3 notifications gĂ©o
- Quand je consulte l'écran principal
- Alors je vois un badge "3" sur l'icĂŽne "File d'attente"
- Et je sais qu'il y a 3 contenus géo en attente
-
- Scénario: Animation fluide de la notification
- Quand une notification géo apparaßt
- Alors elle glisse du bas vers le haut de l'écran
- Et l'animation dure 300ms
- Et elle est fluide (60 FPS)
- Et elle ne bloque pas l'interface principale
-
- Scénario: Notification en arriÚre-plan (app fermée)
- Ătant donnĂ© que l'app est fermĂ©e
- Et que les notifications sont autorisées
- Quand je passe Ă <500m d'un point GPS
- Alors je reçois une notification push systÚme:
- """
- đïž RoadWave
-
- Histoire du Louvre
- Ă 400m âą 12 min
-
- Ouvrir pour écouter
- """
- Et en tapant dessus, l'app s'ouvre et le contenu peut ĂȘtre lancĂ©
diff --git a/features/ui/recommendation/parametres-personnalisation.feature b/features/ui/recommendation/parametres-personnalisation.feature
deleted file mode 100644
index 96487ad..0000000
--- a/features/ui/recommendation/parametres-personnalisation.feature
+++ /dev/null
@@ -1,314 +0,0 @@
-# language: fr
-Fonctionnalité: UI - ParamÚtres de personnalisation et profils
- En tant qu'utilisateur
- Je veux personnaliser mon expérience avec des curseurs et profils
- Afin d'adapter l'application à mes différents contextes d'usage
-
- Contexte:
- Ătant donnĂ© que l'application RoadWave est ouverte
- Et que je suis connecté
-
- Scénario: Accéder aux paramÚtres de personnalisation
- Quand j'ouvre le menu principal
- Et que je clique sur "ParamĂštres"
- Et que je clique sur "Personnalisation"
- Alors je vois l'écran "Personnalisation des recommandations"
- Et je vois trois curseurs disponibles:
- | curseur | icĂŽne | description |
- | GĂ©olocalisation | đ | Local â slider â National |
- | DĂ©couverte | đČ | 0% â slider â 50% |
- | Politique | âïž | Masquer / ĂquilibrĂ© / PrĂ©fĂ©rĂ© |
-
- Scénario: Déplacer le curseur Géolocalisation vers Local
- Ătant donnĂ© que je suis sur l'Ă©cran de personnalisation
- Et que le curseur Géolocalisation est au centre (défaut)
- Quand je déplace le curseur vers la gauche (Local)
- Alors le curseur se positionne Ă 30% (local)
- Et je vois le texte "Recommandations locales privilégiées"
- Et un indicateur visuel montre que la zone géographique est réduite
- Et je vois "Portée: ~50 km"
-
- Scénario: Déplacer le curseur Géolocalisation vers National
- Ătant donnĂ© que je suis sur l'Ă©cran de personnalisation
- Quand je déplace le curseur Géolocalisation vers la droite (National)
- Alors le curseur se positionne Ă 80% (national)
- Et je vois le texte "Découverte nationale activée"
- Et je vois "Portée: toute la France"
- Et une carte de France s'affiche avec la zone en surbrillance
-
- Scénario: Régler le curseur Découverte à 0%
- Quand je déplace le curseur Découverte tout à gauche (0%)
- Alors le curseur est Ă 0%
- Et je vois l'icĂŽne đŻ "PersonnalisĂ© max"
- Et je vois le message "Aucune surprise, uniquement vos préférences"
- Et un badge "0% aléatoire" s'affiche
-
- Scénario: Régler le curseur Découverte à 10% (défaut)
- Quand je déplace le curseur Découverte à 10%
- Alors je vois l'icĂŽne âïž "ĂquilibrĂ©"
- Et je vois "1 contenu sur 10 sera une découverte"
- Et c'est marqué comme "(Recommandé)"
-
- Scénario: Régler le curseur Découverte à 30%
- Quand je déplace le curseur Découverte à 30%
- Alors je vois l'icĂŽne đČ "DĂ©couverte Ă©levĂ©e"
- Et je vois "3 contenus sur 10 seront des découvertes"
-
- Scénario: Régler le curseur Découverte à 50% (max)
- Quand je déplace le curseur Découverte tout à droite (50%)
- Alors je vois l'icĂŽne đ "DĂ©couverte max"
- Et je vois "50% de contenus aléatoires"
- Et je vois le message "Explorez tout RoadWave!"
-
- Scénario: Sélectionner option Politique "Masquer"
- Ătant donnĂ© que le paramĂštre Politique est sur "ĂquilibrĂ©" (dĂ©faut)
- Quand je clique sur le bouton radio "Masquer"
- Alors l'option "Masquer contenu politique" est sélectionnée
- Et je vois l'icĂŽne đ« "Aucun contenu politique"
- Et je vois "0% de contenus tagués Politique"
-
- ScĂ©nario: SĂ©lectionner option Politique "ĂquilibrĂ©"
- Quand je clique sur le bouton radio "ĂquilibrĂ©"
- Alors l'option est sélectionnée
- Et je vois l'icĂŽne âïž "ĂquilibrĂ©"
- Et je vois "Contenu politique selon vos intĂ©rĂȘts" (dĂ©faut MVP)
-
- Scénario: Sélectionner option Politique "Mes préférences"
- Quand je clique sur le bouton radio "Mes préférences"
- Alors l'option est sélectionnée
- Et je vois l'icĂŽne â€ïž "Selon votre jauge Politique"
- Et je vois "Basé sur votre jauge 'Politique': 45%"
-
- Scénario: Sauvegarder les modifications de paramÚtres
- Ătant donnĂ© que j'ai modifiĂ© les 3 curseurs
- Quand je clique sur "Sauvegarder"
- Alors je vois une animation de confirmation
- Et je vois "ParamĂštres enregistrĂ©s â"
- Et je retourne à l'écran précédent
- Et les nouvelles recommandations utilisent ces paramĂštres
-
- Scénario: Annuler les modifications de paramÚtres
- Ătant donnĂ© que j'ai modifiĂ© les curseurs
- Et que je n'ai pas sauvegardé
- Quand je clique sur "Retour"
- Alors je vois une popup "Sauvegarder les modifications?"
- Et je vois deux boutons "Sauvegarder" et "Abandonner"
- Quand je clique sur "Abandonner"
- Alors les paramÚtres ne sont pas modifiés
- Et je retourne à l'écran précédent
-
- Scénario: Créer un nouveau profil personnalisé
- Ătant donnĂ© que je suis sur l'Ă©cran de personnalisation
- Quand je clique sur "Créer un profil"
- Alors je vois un popup "Nouveau profil"
- Et je peux saisir un nom de profil
- Et je peux choisir une icĂŽne:
- | icĂŽne | description |
- | đ | Trajet quotidien |
- | đŁïž | Road trip |
- | đ¶ | Enfants |
- | đ | Sport |
- | đ” | Musique |
-
- Scénario: Créer profil "Trajet quotidien"
- Quand je crée un profil nommé "Trajet quotidien"
- Et que je choisis l'icĂŽne đ
- Et que je configure:
- | paramĂštre | valeur |
- | Géolocalisation | Local |
- | Découverte | 5% |
- | Politique | Masquer |
- Et que je clique sur "Créer le profil"
- Alors le profil "đ Trajet quotidien" est créé
- Et je le vois dans la liste des profils
- Et je vois "Profil créé avec succÚs"
-
- Scénario: Créer profil "Road trip"
- Quand je crée un profil nommé "Road trip"
- Et que je choisis l'icĂŽne đŁïž
- Et que je configure:
- | paramĂštre | valeur |
- | Géolocalisation | Régional |
- | Découverte | 30% |
- | Politique | ĂquilibrĂ© |
- Alors le profil est créé et sauvegardé
-
- Scénario: Créer profil "Enfants" avec Mode Kids
- Quand je crée un profil nommé "Enfants"
- Et que je choisis l'icĂŽne đ¶
- Et que j'active "Mode Kids"
- Alors le profil est créé avec:
- | paramĂštre | valeur |
- | Mode Kids | Activé |
- | Politique | Masquer (forcé) |
- | Publicité | Aucune (forcé) |
- Et les autres paramÚtres sont grisés/verrouillés
-
- Scénario: Afficher la liste des profils
- Ătant donnĂ© que j'ai créé 3 profils:
- | nom | icĂŽne | actif |
- | Trajet quotidien | đ | Non |
- | Road trip | đŁïž | Oui |
- | Enfants | đ¶ | Non |
- Quand je consulte l'écran de personnalisation
- Alors je vois la section "Mes profils"
- Et je vois mes 3 profils sous forme de cartes
- Et le profil "Road trip" est marqué avec un badge "Actif"
-
- Scénario: Activer un profil existant
- Ătant donnĂ© que le profil "Road trip" est actif
- Et que je vois le profil "Trajet quotidien"
- Quand je clique sur la carte "Trajet quotidien"
- Alors je vois un popup de confirmation "Activer ce profil?"
- Et je vois un aperçu des paramÚtres du profil
- Quand je confirme
- Alors le profil "Trajet quotidien" devient actif
- Et je vois une animation de transition
- Et je vois "Profil 'Trajet quotidien' activĂ© â"
- Et le badge "Actif" se déplace sur ce profil
-
- Scénario: Indicateur visuel du profil actif
- Ătant donnĂ© que le profil "Road trip" est actif
- Quand je consulte l'écran principal
- Alors je vois en haut de l'Ă©cran un badge "đŁïž Road trip"
- Et ce badge indique quel profil est actuellement utilisé
- Et je peux taper dessus pour switcher rapidement
-
- Scénario: Switcher rapidement de profil depuis l'écran principal
- Ătant donnĂ© que je suis sur l'Ă©cran principal
- Et que le profil "Road trip" est actif
- Quand je tape sur le badge "đŁïž Road trip"
- Alors je vois une liste déroulante de tous mes profils
- Quand je sĂ©lectionne "đ Trajet quotidien"
- Alors le profil change instantanément
- Et je vois "Profil changé"
- Et les recommandations se rechargent
-
- Scénario: Modifier un profil existant
- Ătant donnĂ© que j'ai un profil "Trajet quotidien"
- Quand je fais un appui long sur la carte du profil
- Alors je vois un menu contextuel avec:
- | action | icĂŽne |
- | Modifier | âïž |
- | Dupliquer | đ |
- | Supprimer | đïž |
- Quand je clique sur "Modifier"
- Alors je peux modifier les paramĂštres du profil
- Et je sauvegarde les changements
-
- Scénario: Dupliquer un profil
- Ătant donnĂ© que j'ai un profil "Road trip"
- Quand je fais un appui long et choisis "Dupliquer"
- Alors un nouveau profil "Road trip (copie)" est créé
- Et il a les mĂȘmes paramĂštres que l'original
- Et je peux le renommer et modifier
-
- Scénario: Supprimer un profil
- Ătant donnĂ© que j'ai un profil "Ancien profil"
- Quand je fais un appui long et choisis "Supprimer"
- Alors je vois une confirmation "Supprimer ce profil?"
- Quand je confirme
- Alors le profil est supprimé
- Et je vois "Profil supprimé"
-
- Scénario: Impossible de supprimer le profil actif
- Ătant donnĂ© que le profil "Road trip" est actif
- Quand je fais un appui long et choisis "Supprimer"
- Alors je vois "Impossible de supprimer le profil actif"
- Et je dois d'abord activer un autre profil
-
- Scénario: Synchronisation profils entre devices
- Ătant donnĂ© que j'ai créé 2 profils sur mon iPhone
- Quand je me connecte sur mon iPad
- Alors je vois mes 2 profils automatiquement synchronisés
- Et le profil actif sur iPhone est aussi actif sur iPad
- Et je vois "Profils synchronisés depuis iPhone"
-
- Scénario: Modification profil synchronisée en temps réel
- Ătant donnĂ© que j'ai ouvert l'app sur iPhone et iPad
- Quand je modifie un profil sur iPhone
- Alors le profil est mis à jour sur iPad en temps réel
- Et je vois une notification "Profil mis Ă jour" sur iPad
-
- Scénario: Auto-switch selon contexte (détection trajet)
- Ătant donnĂ© que j'ai un profil "Trajet quotidien"
- Et que l'option "Auto-switch intelligent" est activée
- Quand l'app détecte que je suis sur mon trajet habituel (GPS récurrent)
- Alors le profil "Trajet quotidien" s'active automatiquement
- Et je vois une notification "Profil 'Trajet quotidien' activé"
- Et je peux annuler en 5 secondes
-
- Scénario: Désactiver l'auto-switch intelligent
- Ătant donnĂ© que l'auto-switch est activĂ©
- Quand je désactive l'option dans les paramÚtres
- Alors aucun changement automatique de profil n'est fait
- Et je garde le contrĂŽle total
-
- Scénario: Limitation nombre de profils
- Ătant donnĂ© que j'ai créé 5 profils (maximum)
- Quand j'essaie de créer un 6Úme profil
- Alors je vois "Limite de 5 profils atteinte"
- Et je dois supprimer un profil pour en créer un nouveau
-
- Scénario: Blocage modification paramÚtres en conduite
- Ătant donnĂ© que je suis en conduite (vitesse GPS > 10 km/h)
- Quand j'essaie d'ouvrir les paramĂštres de personnalisation
- Alors l'accÚs est bloqué
- Et je vois "â ïž Configurez avant de prendre la route"
- Et je dois arrĂȘter le vĂ©hicule pour modifier
-
- Scénario: Warning au lancement app
- Quand je lance l'application pour la premiĂšre fois
- Alors je vois un message de bienvenue
- Et je vois "Configurez vos préférences avant de prendre la route"
- Et je peux accéder directement aux paramÚtres
- Ou "Configurer plus tard"
-
- Scénario: Profil par défaut pour nouveaux utilisateurs
- Ătant donnĂ© que je viens de m'inscrire
- Quand j'ouvre l'app pour la premiĂšre fois
- Alors un profil "Par défaut" est créé automatiquement
- Et il a les paramĂštres standards:
- | paramĂštre | valeur |
- | GĂ©olocalisation | ĂquilibrĂ© |
- | Découverte | 10% |
- | Politique | ĂquilibrĂ© |
-
- Scénario: Prévisualisation des modifications en temps réel
- Ătant donnĂ© que je modifie le curseur GĂ©olocalisation
- Quand je déplace le curseur
- Alors je vois une prévisualisation en temps réel:
- | élément | affichage |
- | Rayon géographique | Cercle sur mini-carte |
- | Nombre contenus impactés | "~250 contenus à proximité"|
- | Distance max | "100 km" |
-
- Scénario: Tooltip explicatif sur chaque curseur
- Quand je tape sur l'icĂŽne âčïž Ă cĂŽtĂ© du curseur GĂ©olocalisation
- Alors je vois un tooltip explicatif:
- """
- Géolocalisation
-
- Local: Privilégie les contenus trÚs proches (< 50 km)
- National: Découvrez des contenus de toute la France
-
- Idéal en Local pour les trajets quotidiens,
- en National pour les road trips.
- """
-
- Scénario: Exporter/Importer profils
- Ătant donnĂ© que j'ai configurĂ© mes profils parfaitement
- Quand je clique sur "Exporter mes profils"
- Alors un fichier JSON est généré
- Et je peux le partager avec un autre appareil
- Quand j'importe ce fichier sur un autre appareil
- Alors tous mes profils sont restaurés
-
- Scénario: Reset profils aux valeurs par défaut
- Ătant donnĂ© que j'ai modifiĂ© tous mes paramĂštres
- Quand je clique sur "Réinitialiser aux valeurs par défaut"
- Alors je vois une confirmation
- Quand je confirme
- Alors tous les profils sont supprimés
- Et un profil "Par défaut" est recréé
- Et je vois "ParamÚtres réinitialisés"
diff --git a/mkdocs.yml b/mkdocs.yml
index 7902f4c..f965076 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -87,50 +87,70 @@ nav:
- 'ADR-023: Architecture Modération': adr/023-architecture-moderation.md
- 'ADR-024: Monitoring & Observabilité': adr/024-monitoring-observabilite.md
- 'ADR-025: Sécurité & Secrets': adr/025-securite-secrets.md
- - RÚgles Métier:
- - Introduction: regles-metier/README.md
- - Fondations & Compte:
- - '01: Authentification': regles-metier/01-authentification-inscription.md
- - '02: Conformité RGPD': regles-metier/02-conformite-rgpd.md
- - Consommation de contenu:
- - '03: Centres IntĂ©rĂȘt': regles-metier/03-centres-interet-jauges.md
- - '04: Algorithme Recommandation': regles-metier/04-algorithme-recommandation.md
- - '05: Interactions Navigation': regles-metier/05-interactions-navigation.md
- - '06: Audio-guides': regles-metier/06-audio-guides-multi-sequences.md
- - '07: Contenus Voiture': regles-metier/07-contenus-geolocalises-voiture.md
- - '08: Mode Offline': regles-metier/08-mode-offline.md
- - '09: Abonnements': regles-metier/09-abonnements-notifications.md
- - '10: Gestion Erreurs': regles-metier/10-gestion-erreurs.md
- - Création de contenu:
- - '11: Création Contenu': regles-metier/11-creation-publication-contenu.md
- - '12: Radio Live': regles-metier/12-radio-live.md
- - '13: Contenu Protégé': regles-metier/13-detection-contenu-protege.md
- - Modération & Sécurité:
- - '14: Modération': regles-metier/14-moderation-flows.md
- - '15: Modération Communautaire': regles-metier/15-moderation-communautaire.md
- - Monétisation & Business:
- - '16: Publicités': regles-metier/16-publicites.md
- - '17: Premium': regles-metier/17-premium.md
- - '18: Monétisation Créateurs': regles-metier/18-monetisation-createurs.md
- - Transverse:
- - '19: Autres Comportements': regles-metier/19-autres-comportements.md
- - 'Annexe: Post-MVP': regles-metier/ANNEXE-POST-MVP.md
- - Diagrammes:
- - Flux:
- - 'Processus de signalement': diagrammes/flux/moderation-signalement.md
- - Ătats:
- - 'Cycle de vie signalement': diagrammes/etats/signalement-lifecycle.md
- - Séquences:
- - "Processus d'appel modération": diagrammes/sequence/processus-appel-moderation.md
- - Entités:
- - 'ModĂšle global': diagrammes/entites/modele-global.md
- - 'ModĂšle recommandation': diagrammes/entites/modele-recommandation.md
- - 'ModÚle publicités': diagrammes/entites/modele-publicites.md
- - 'ModĂšle premium': diagrammes/entites/modele-premium.md
- - 'ModÚle monétisation': diagrammes/entites/modele-monetisation.md
- - 'ModĂšle audio-guides': diagrammes/entites/modele-audio-guides.md
- - 'ModĂšle radio live': diagrammes/entites/modele-radio-live.md
- - 'ModÚle modération': diagrammes/entites/modele-moderation.md
+ - Domaines DDD:
+ - 'Context Map': domains/README.md
+ - 'Core Domain':
+ - 'đ Shared': domains/_shared/README.md
+ - RĂšgles:
+ - Authentification: domains/_shared/rules/authentification.md
+ - RGPD: domains/_shared/rules/rgpd.md
+ - Gestion Erreurs: domains/_shared/rules/gestion-erreurs.md
+ - 'Annexe Post-MVP': domains/_shared/rules/ANNEXE-POST-MVP.md
+ - Entités:
+ - ModĂšle Global: domains/_shared/entities/modele-global.md
+ - 'Supporting Subdomains':
+ - 'đŻ Recommendation':
+ - Vue d'ensemble: domains/recommendation/README.md
+ - RĂšgles:
+ - Centres IntĂ©rĂȘt: domains/recommendation/rules/centres-interet-jauges.md
+ - Algorithme: domains/recommendation/rules/algorithme-recommandation.md
+ - Interactions: domains/recommendation/rules/interactions-navigation.md
+ - Entités:
+ - ModĂšle Recommandation: domains/recommendation/entities/modele-recommandation.md
+ - 'đïž Content':
+ - Vue d'ensemble: domains/content/README.md
+ - RĂšgles:
+ - Création & Publication: domains/content/rules/creation-publication.md
+ - Audio-guides: domains/content/rules/audio-guides.md
+ - Radio Live: domains/content/rules/radio-live.md
+ - Contenus Géolocalisés: domains/content/rules/contenus-geolocalises.md
+ - Contenu Protégé: domains/content/rules/detection-contenu-protege.md
+ - Entités:
+ - ModĂšle Audio-guides: domains/content/entities/modele-audio-guides.md
+ - ModĂšle Radio Live: domains/content/entities/modele-radio-live.md
+ - 'đĄïž Moderation':
+ - Vue d'ensemble: domains/moderation/README.md
+ - RĂšgles:
+ - Modération: domains/moderation/rules/moderation-flows.md
+ - Modération Communautaire: domains/moderation/rules/moderation-communautaire.md
+ - Autres Comportements: domains/moderation/rules/autres-comportements.md
+ - Entités:
+ - ModÚle Modération: domains/moderation/entities/modele-moderation.md
+ - Diagrammes:
+ - 'Flux: Signalement': domains/moderation/flows/moderation-signalement.md
+ - 'Ătats: Lifecycle': domains/moderation/states/signalement-lifecycle.md
+ - 'Séquence: Appel': domains/moderation/sequences/processus-appel-moderation.md
+ - 'Generic Subdomains':
+ - 'đą Advertising':
+ - Vue d'ensemble: domains/advertising/README.md
+ - RĂšgles:
+ - Publicités: domains/advertising/rules/publicites.md
+ - Entités:
+ - ModÚle Publicités: domains/advertising/entities/modele-publicites.md
+ - 'đ Premium':
+ - Vue d'ensemble: domains/premium/README.md
+ - RĂšgles:
+ - Premium: domains/premium/rules/premium.md
+ - Mode Offline: domains/premium/rules/mode-offline.md
+ - Abonnements: domains/premium/rules/abonnements-notifications.md
+ - Entités:
+ - ModĂšle Premium: domains/premium/entities/modele-premium.md
+ - 'đ° Monetization':
+ - Vue d'ensemble: domains/monetization/README.md
+ - RĂšgles:
+ - Monétisation Créateurs: domains/monetization/rules/monetisation-createurs.md
+ - Entités:
+ - ModÚle Monétisation: domains/monetization/entities/modele-monetisation.md
- Documentation Légale:
- Introduction: legal/README.md
- "Conditions Générales d'Utilisation": legal/cgu.md
@@ -151,9 +171,6 @@ nav:
- Architecture & Techniques:
- Séquences:
- 'Cache Géospatial': architecture/sequences/cache-geospatial.md
- - Modération (Gherkin):
- - "Vue d'ensemble": gherkin-moderation-overview.md
- - Tests BDD: bdd/
extra:
social:
diff --git a/scripts/fix-markdown-links.sh b/scripts/fix-markdown-links.sh
new file mode 100755
index 0000000..649cc68
--- /dev/null
+++ b/scripts/fix-markdown-links.sh
@@ -0,0 +1,141 @@
+#!/bin/bash
+# Script pour corriger les liens internes dans la documentation aprĂšs refactorisation DDD
+
+set -e
+
+echo "đ Correction des liens internes dans la documentation..."
+
+# Fonction pour corriger les liens dans les fichiers du domaine _shared
+fix_shared_links() {
+ echo " â Correction des liens dans _shared..."
+ find docs/domains/_shared -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/01-authentification-inscription.md|../rules/authentification.md|g' \
+ -e 's|../../regles-metier/02-conformite-rgpd.md|../rules/rgpd.md|g' \
+ -e 's|../../regles-metier/10-gestion-erreurs.md|../rules/gestion-erreurs.md|g' \
+ -e 's|modele-global.md|../entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine recommendation
+fix_recommendation_links() {
+ echo " â Correction des liens dans recommendation..."
+ find docs/domains/recommendation -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/03-centres-interet-jauges.md|../rules/centres-interet-jauges.md|g' \
+ -e 's|../../regles-metier/04-algorithme-recommandation.md|../rules/algorithme-recommandation.md|g' \
+ -e 's|../../regles-metier/05-interactions-navigation.md|../rules/interactions-navigation.md|g' \
+ -e 's|../../docs/regles-metier/04-algorithme-recommandation.md|../rules/algorithme-recommandation.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine content
+fix_content_links() {
+ echo " â Correction des liens dans content..."
+ find docs/domains/content -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/06-audio-guides-multi-sequences.md|../rules/audio-guides.md|g' \
+ -e 's|../../regles-metier/07-contenus-geolocalises-voiture.md|../rules/contenus-geolocalises.md|g' \
+ -e 's|../../regles-metier/11-creation-publication-contenu.md|../rules/creation-publication.md|g' \
+ -e 's|../../regles-metier/12-radio-live.md|../rules/radio-live.md|g' \
+ -e 's|../../regles-metier/13-detection-contenu-protege.md|../rules/detection-contenu-protege.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine advertising
+fix_advertising_links() {
+ echo " â Correction des liens dans advertising..."
+ find docs/domains/advertising -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/16-publicites.md|../rules/publicites.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine premium
+fix_premium_links() {
+ echo " â Correction des liens dans premium..."
+ find docs/domains/premium -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/08-mode-offline.md|../rules/mode-offline.md|g' \
+ -e 's|../../regles-metier/09-abonnements-notifications.md|../rules/abonnements-notifications.md|g' \
+ -e 's|../../regles-metier/17-premium.md|../rules/premium.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine monetization
+fix_monetization_links() {
+ echo " â Correction des liens dans monetization..."
+ find docs/domains/monetization -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/18-monetisation-createurs.md|../rules/monetisation-createurs.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les fichiers du domaine moderation
+fix_moderation_links() {
+ echo " â Correction des liens dans moderation..."
+ find docs/domains/moderation -type f -name "*.md" -exec sed -i \
+ -e 's|../../regles-metier/14-moderation-flows.md|../rules/moderation-flows.md|g' \
+ -e 's|../../regles-metier/15-moderation-communautaire.md|../rules/moderation-communautaire.md|g' \
+ -e 's|../../regles-metier/19-autres-comportements.md|../rules/autres-comportements.md|g' \
+ -e 's|modele-global.md|../../_shared/entities/modele-global.md|g' \
+ {} \;
+}
+
+# Fonction pour corriger les liens dans les autres fichiers docs (ADR, etc.)
+fix_other_docs_links() {
+ echo " â Correction des liens dans ADR et autres docs..."
+
+ # ADR et autres fichiers qui référencent les anciennes rÚgles métier
+ find docs/adr docs/mobile docs/compliance docs/architecture -type f -name "*.md" 2>/dev/null -exec sed -i \
+ -e 's|regles-metier/01-authentification-inscription.md|domains/_shared/rules/authentification.md|g' \
+ -e 's|regles-metier/02-conformite-rgpd.md|domains/_shared/rules/rgpd.md|g' \
+ -e 's|regles-metier/03-centres-interet-jauges.md|domains/recommendation/rules/centres-interet-jauges.md|g' \
+ -e 's|regles-metier/04-algorithme-recommandation.md|domains/recommendation/rules/algorithme-recommandation.md|g' \
+ -e 's|regles-metier/05-interactions-navigation.md|domains/recommendation/rules/interactions-navigation.md|g' \
+ -e 's|regles-metier/06-audio-guides-multi-sequences.md|domains/content/rules/audio-guides.md|g' \
+ -e 's|regles-metier/07-contenus-geolocalises-voiture.md|domains/content/rules/contenus-geolocalises.md|g' \
+ -e 's|regles-metier/08-mode-offline.md|domains/premium/rules/mode-offline.md|g' \
+ -e 's|regles-metier/09-abonnements-notifications.md|domains/premium/rules/abonnements-notifications.md|g' \
+ -e 's|regles-metier/10-gestion-erreurs.md|domains/_shared/rules/gestion-erreurs.md|g' \
+ -e 's|regles-metier/11-creation-publication-contenu.md|domains/content/rules/creation-publication.md|g' \
+ -e 's|regles-metier/12-radio-live.md|domains/content/rules/radio-live.md|g' \
+ -e 's|regles-metier/13-detection-contenu-protege.md|domains/content/rules/detection-contenu-protege.md|g' \
+ -e 's|regles-metier/14-moderation-flows.md|domains/moderation/rules/moderation-flows.md|g' \
+ -e 's|regles-metier/15-moderation-communautaire.md|domains/moderation/rules/moderation-communautaire.md|g' \
+ -e 's|regles-metier/16-publicites.md|domains/advertising/rules/publicites.md|g' \
+ -e 's|regles-metier/17-premium.md|domains/premium/rules/premium.md|g' \
+ -e 's|regles-metier/18-monetisation-createurs.md|domains/monetization/rules/monetisation-createurs.md|g' \
+ -e 's|regles-metier/19-autres-comportements.md|domains/moderation/rules/autres-comportements.md|g' \
+ -e 's|diagrammes/entites/modele-global.md|domains/_shared/entities/modele-global.md|g' \
+ -e 's|diagrammes/entites/modele-recommandation.md|domains/recommendation/entities/modele-recommandation.md|g' \
+ -e 's|diagrammes/entites/modele-audio-guides.md|domains/content/entities/modele-audio-guides.md|g' \
+ -e 's|diagrammes/entites/modele-radio-live.md|domains/content/entities/modele-radio-live.md|g' \
+ -e 's|diagrammes/entites/modele-publicites.md|domains/advertising/entities/modele-publicites.md|g' \
+ -e 's|diagrammes/entites/modele-premium.md|domains/premium/entities/modele-premium.md|g' \
+ -e 's|diagrammes/entites/modele-monetisation.md|domains/monetization/entities/modele-monetisation.md|g' \
+ -e 's|diagrammes/entites/modele-moderation.md|domains/moderation/entities/modele-moderation.md|g' \
+ -e 's|diagrammes/flux/moderation-signalement.md|domains/moderation/flows/moderation-signalement.md|g' \
+ -e 's|diagrammes/etats/signalement-lifecycle.md|domains/moderation/states/signalement-lifecycle.md|g' \
+ -e 's|diagrammes/sequence/processus-appel-moderation.md|domains/moderation/sequences/processus-appel-moderation.md|g' \
+ {} \; 2>/dev/null || true
+
+ # Fichier gherkin-moderation-overview.md
+ if [ -f docs/gherkin-moderation-overview.md ]; then
+ sed -i \
+ -e 's|regles-metier/14-moderation-flows.md|domains/moderation/rules/moderation-flows.md|g' \
+ -e 's|regles-metier/15-moderation-communautaire.md|domains/moderation/rules/moderation-communautaire.md|g' \
+ docs/gherkin-moderation-overview.md
+ fi
+}
+
+# Exécuter toutes les corrections
+fix_shared_links
+fix_recommendation_links
+fix_content_links
+fix_advertising_links
+fix_premium_links
+fix_monetization_links
+fix_moderation_links
+fix_other_docs_links
+
+echo "â
Correction des liens terminée!"
diff --git a/scripts/generate-bdd-docs.py b/scripts/generate-bdd-docs.py
index ddd465e..e1a58b3 100644
--- a/scripts/generate-bdd-docs.py
+++ b/scripts/generate-bdd-docs.py
@@ -367,7 +367,7 @@ def main():
"""Point d'entrée principal"""
# Chemins
project_root = Path(__file__).parent.parent
- features_dir = project_root / 'features'
+ features_dir = project_root / 'docs' / 'domains'
output_dir = project_root / 'docs' / 'bdd'
# Nettoyer le dossier de sortie