Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture. ## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU) - Créer structure features/{api,ui,e2e} - Déplacer 83 features en 3 catégories via git mv (historique préservé) - features/api/ : 53 features (tests API backend) - features/ui/ : 22 features (tests UI mobile) - features/e2e/ : 8 features (tests end-to-end) Domaines déplacés : - API : authentication, recommendation, rgpd-compliance, content-creation, moderation, monetisation, premium, radio-live, publicites - UI : audio-guides, navigation, interest-gauges, mode-offline, partage, profil, recherche - E2E : abonnements, error-handling ## Phase 2 : Mise à jour Documentation ### ADR-007 - Tests BDD - Ajouter section "Convention de Catégorisation des Features" - Documenter règles api/ui/e2e avec exemples concrets - Spécifier step definitions (backend Go, mobile Dart) ### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU) - Créer ADR dédié pour stratégie CI/CD avec path filters - Architecture workflows séparés (backend.yml, mobile.yml, shared.yml) - Configuration path filters détaillée avec exemples YAML - Matrice de déclenchement et optimisations (~70% gain temps CI) - Plan d'implémentation (~2h, reporté jusqu'au développement) ### ADR-016 - Organisation Monorepo - Simplifier en retirant section CI/CD détaillée - Ajouter référence vers ADR-024 pour stratégie CI/CD ### INCONSISTENCIES-ANALYSIS.md - Point #10 (Tests BDD synchronisés) : ✅ RÉSOLU - Catégorisation features implémentée - ADR-007 mis à jour avec convention complète - Point #11 (70/30 Split paiements) : ✅ ANNULÉ (faux problème) - ADR-009 et Règle 18 parfaitement cohérents - Documentation exhaustive existante (formule, SQL, comparaisons) - Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ - Architecture CI/CD complète dans ADR-024 - Implémentation reportée (projet en phase documentation) - Métriques mises à jour : - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté) - ADR à jour : 100% (19/19 avec ADR-024) ## Phase 3 : Validation - Structure features validée (api/ui/e2e, aucun répertoire restant) - Historique Git préservé (git mv, renommages détectés) - 83 features total (API: 53, UI: 22, E2E: 8) Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
264 lines
12 KiB
Gherkin
264 lines
12 KiB
Gherkin
# language: fr
|
||
Fonctionnalité: Audio-guides multi-séquences pour piétons
|
||
En tant qu'auditeur à pied
|
||
Je veux profiter d'audio-guides structurés lors de mes visites
|
||
Afin de découvrir des lieux de manière autonome et à mon rythme
|
||
|
||
Contexte:
|
||
Étant donné que l'API RoadWave est disponible
|
||
Et que je suis connecté en tant qu'auditeur
|
||
Et que je suis en mode piéton (vitesse <5 km/h)
|
||
|
||
Scénario: Détection d'audio-guide à proximité
|
||
Étant donné que je me trouve à 80 mètres du Musée du Louvre
|
||
Et que 3 audio-guides sont disponibles pour ce lieu
|
||
Quand le système détecte ma position
|
||
Alors je reçois une notification push:
|
||
"""
|
||
📍 Audio-guide disponible : Musée du Louvre
|
||
Choisissez parmi 3 guides pour Musée du Louvre
|
||
Tap pour explorer
|
||
"""
|
||
|
||
Scénario: Rayon de détection de 100m
|
||
Étant donné qu'un audio-guide est centré aux coordonnées GPS du Louvre
|
||
Quand je suis à exactement 100m du centre
|
||
Alors la notification est déclenchée
|
||
Et quand je suis à 101m, aucune notification n'est envoyée
|
||
|
||
Scénario: Page de sélection des audio-guides
|
||
Étant donné que j'ai tapé sur la notification audio-guide
|
||
Quand la page de sélection s'affiche
|
||
Alors je vois une liste de guides disponibles:
|
||
| titre | créateur | nb_sequences | durée | note | écoutes |
|
||
| Visite complète | Créateur A | 12 | 45 min | 4.8 | 1.2K |
|
||
| Œuvres majeures | Créateur B | 5 | 20 min | 4.9 | 3.5K |
|
||
| Visite famille | Créateur C | 8 | 30 min | 4.7 | 850 |
|
||
|
||
Scénario: Sélection d'un audio-guide
|
||
Étant donné que je suis sur la page de sélection
|
||
Quand je tape sur "Visite complète (45 min)"
|
||
Alors l'interface de lecture d'audio-guide s'ouvre
|
||
Et la séquence 1 commence automatiquement
|
||
Et je vois la liste complète des 12 séquences
|
||
|
||
Scénario: Interface de lecture audio-guide
|
||
Étant donné que j'ai sélectionné un audio-guide de 12 séquences
|
||
Quand l'interface s'affiche
|
||
Alors je vois:
|
||
| élément | exemple |
|
||
| Titre guide | 🎨 Visite complète • Musée du Louvre |
|
||
| Piste actuelle | Piste 2/12 |
|
||
| Titre séquence | "La Joconde - Histoire et mystères" |
|
||
| Barre de progression | 3:24 / 6:50 |
|
||
| Liste séquences | ✅ 1. Intro, ▶️ 2. Joconde, ⏸️ 3. Vénus... |
|
||
| Boutons navigation | Précédent, Play/Pause, Suivant |
|
||
|
||
Scénario: Navigation vers séquence suivante
|
||
Étant donné que j'écoute la séquence 2
|
||
Quand je tape sur "Suivant"
|
||
Alors la séquence 3 commence immédiatement
|
||
Et le titre de la séquence s'affiche: "Vénus de Milo"
|
||
Et la barre de progression se réinitialise
|
||
|
||
Scénario: Navigation vers séquence précédente
|
||
Étant donné que j'écoute la séquence 5
|
||
Quand je tape sur "Précédent"
|
||
Alors la séquence 4 recommence depuis le début
|
||
Et je peux réécouter cette séquence
|
||
|
||
Scénario: Saut direct à une séquence spécifique
|
||
Étant donné que j'écoute la séquence 2
|
||
Et que la liste des séquences est affichée
|
||
Quand je tape sur "7. Peintures Renaissance"
|
||
Alors la séquence 7 démarre immédiatement
|
||
Et je passe directement de la séquence 2 à la 7
|
||
|
||
Scénario: Commande vocale "Suivant"
|
||
Étant donné que j'écoute la séquence 3
|
||
Quand je dis "Suivant" via la commande vocale
|
||
Alors la séquence 4 démarre
|
||
Et la commande vocale fonctionne même si l'écran est verrouillé
|
||
|
||
Scénario: Commande vocale "Précédent"
|
||
Étant donné que j'écoute la séquence 6
|
||
Quand je dis "Précédent" via la commande vocale
|
||
Alors la séquence 5 démarre depuis le début
|
||
|
||
Scénario: Pause et reprise à la position exacte
|
||
Étant donné que j'écoute la séquence 4 à la position 2:30
|
||
Quand je mets en pause
|
||
Et que j'attends 5 minutes
|
||
Et que je reprends la lecture
|
||
Alors la séquence reprend exactement à 2:30
|
||
Et aucune donnée n'est perdue
|
||
|
||
Scénario: Guidage vocal automatique entre séquences
|
||
Étant donné que la séquence 2 se termine
|
||
Quand la transition vers la séquence 3 se produit
|
||
Alors j'entends un message vocal:
|
||
"""
|
||
Vous avez terminé la séquence 2. Dirigez-vous vers la Vénus de Milo pour la séquence 3.
|
||
"""
|
||
Et la séquence 3 ne démarre pas automatiquement (navigation manuelle)
|
||
|
||
Scénario: Avertissement si éloignement du point d'intérêt
|
||
Étant donné que je suis dans le guide du Louvre
|
||
Et que je devrais être devant la Vénus de Milo (séquence 3)
|
||
Quand je m'éloigne de plus de 50m de ce point
|
||
Alors j'entends un message vocal:
|
||
"""
|
||
Vous vous éloignez de la prochaine étape. Consultez le plan.
|
||
"""
|
||
Et un bouton "Voir le plan" apparaît dans l'interface
|
||
|
||
Scénario: Sauvegarde automatique de la progression
|
||
Étant donné que j'écoute la séquence 5 à la position 1:45
|
||
Quand je ferme l'application brutalement
|
||
Et que je la rouvre 10 minutes plus tard
|
||
Alors je vois une popup "Reprendre la visite du Musée du Louvre ?"
|
||
Et si je choisis "Reprendre", je retourne à la séquence 5 à 1:45
|
||
|
||
Scénario: Option de recommencer depuis le début
|
||
Étant donné que j'ai une progression sauvegardée à la séquence 7
|
||
Quand je rouvre le guide
|
||
Alors je vois 2 options:
|
||
| option | action |
|
||
| Reprendre à la séquence 7 | Reprend à la position exacte |
|
||
| Recommencer depuis le début | Retourne à la séquence 1 |
|
||
|
||
Scénario: Expiration de la sauvegarde après 30 jours
|
||
Étant donné que j'ai une progression sauvegardée depuis 30 jours
|
||
Quand j'essaie de reprendre le guide
|
||
Alors la sauvegarde est considérée comme expirée
|
||
Et je recommence depuis la séquence 1
|
||
Et je vois le message "Votre précédente visite date de plus de 30 jours. Recommençons depuis le début."
|
||
|
||
Scénario: Synchronisation multi-device de la progression
|
||
Étant donné que j'écoute un guide sur mon iPhone à la séquence 4
|
||
Quand je ferme l'app et ouvre sur mon iPad
|
||
Alors je vois la progression synchronisée
|
||
Et je peux reprendre à la séquence 4 sur l'iPad
|
||
|
||
Scénario: Marquage "Terminé" après toutes les séquences
|
||
Étant donné que j'écoute la dernière séquence (12/12)
|
||
Quand cette séquence se termine
|
||
Alors le guide est marqué "✅ Terminé" dans mon historique
|
||
Et je vois un message de félicitation:
|
||
"""
|
||
Félicitations ! Vous avez terminé la visite complète du Musée du Louvre.
|
||
"""
|
||
Et le créateur gagne les statistiques d'écoute complète
|
||
|
||
Scénario: Création d'audio-guide par un créateur
|
||
Étant donné que je suis un créateur
|
||
Quand je crée un nouvel audio-guide
|
||
Alors je dois:
|
||
| étape | détail |
|
||
| Uploader plusieurs fichiers | 1 fichier MP3 par séquence |
|
||
| Numéroter les séquences | Séquence 1, Séquence 2, etc. |
|
||
| Titrer chaque séquence | "Introduction", "La Joconde", etc. |
|
||
| Définir point GPS unique | Centre du lieu (ex: Louvre) |
|
||
| Définir rayon de détection | Par défaut 100m |
|
||
Et la durée totale est calculée automatiquement
|
||
|
||
Scénario: Structure JSON de stockage audio-guide
|
||
Étant donné qu'un créateur publie un audio-guide du Louvre
|
||
Quand les métadonnées sont stockées en base
|
||
Alors le format JSON contient:
|
||
```json
|
||
{
|
||
"guide_id": "abc123",
|
||
"title": "Visite complète Musée du Louvre",
|
||
"location": {"lat": 48.8606, "lon": 2.3376, "radius": 200},
|
||
"sequences": [
|
||
{
|
||
"sequence_number": 1,
|
||
"title": "Introduction et architecture",
|
||
"audio_url": "https://cdn.../seq1.mp3",
|
||
"duration_seconds": 180
|
||
},
|
||
{
|
||
"sequence_number": 2,
|
||
"title": "La Joconde",
|
||
"audio_url": "https://cdn.../seq2.mp3",
|
||
"duration_seconds": 410
|
||
}
|
||
],
|
||
"total_duration_seconds": 2700,
|
||
"creator_id": "creator_xyz"
|
||
}
|
||
```
|
||
|
||
Scénario: Limitation du nombre de séquences
|
||
Étant donné que je crée un audio-guide
|
||
Quand j'essaie d'ajouter plus de 50 séquences
|
||
Alors je vois le message "Maximum 50 séquences par audio-guide"
|
||
Et je dois structurer mon contenu différemment ou créer plusieurs guides
|
||
|
||
Scénario: Quitter le guide et sauvegarder
|
||
Étant donné que j'écoute la séquence 6
|
||
Quand je tape sur le bouton "×" (fermer)
|
||
Alors je vois une confirmation:
|
||
"""
|
||
Voulez-vous quitter ce guide ?
|
||
Votre progression sera sauvegardée.
|
||
"""
|
||
Et si je confirme, la progression est enregistrée
|
||
Et je retourne à l'écran principal
|
||
|
||
Scénario: Statistiques créateur pour audio-guides
|
||
Étant donné que je suis créateur d'un audio-guide
|
||
Quand je consulte mes statistiques
|
||
Alors je vois:
|
||
| métrique | exemple valeur |
|
||
| Nombre de démarrages | 1250 |
|
||
| Nombre de complétions (100%) | 387 (31%) |
|
||
| Séquence la plus skippée | Séquence 8 |
|
||
| Durée moyenne d'écoute | 28 min (sur 45) |
|
||
|
||
Scénario: Audio-guide multilingue (post-MVP)
|
||
Étant donné qu'un créateur peut publier plusieurs versions linguistiques
|
||
Quand un touriste anglophone visite le Louvre
|
||
Alors il voit les guides disponibles en anglais
|
||
Et peut choisir parmi les guides traduits
|
||
Mais cette fonctionnalité n'est pas disponible en MVP
|
||
|
||
Scénario: Publicité entre séquences d'audio-guide
|
||
Étant donné que je suis un utilisateur gratuit
|
||
Et que j'écoute un audio-guide
|
||
Quand je passe de la séquence 5 à la séquence 6
|
||
Alors une publicité peut être insérée (1 pub toutes les 5 séquences)
|
||
Et la publicité est skippable après 5 secondes
|
||
Et les utilisateurs Premium ne voient pas de publicité
|
||
|
||
Scénario: Audio-guide en mode offline
|
||
Étant donné que j'ai téléchargé un audio-guide complet
|
||
Quand je visite le lieu sans connexion internet
|
||
Alors toutes les séquences sont disponibles hors ligne
|
||
Et la navigation fonctionne normalement
|
||
Et seule la sauvegarde cloud est différée jusqu'à reconnexion
|
||
|
||
Scénario: Notation d'un audio-guide après écoute
|
||
Étant donné que j'ai terminé un audio-guide
|
||
Quand je ferme l'interface
|
||
Alors je vois une popup "Notez cette visite"
|
||
Et je peux donner une note de 1 à 5 étoiles
|
||
Et cette note contribue à la note globale visible par les autres utilisateurs
|
||
|
||
Scénario: Filtrage par langue dans la page de sélection
|
||
Étant donné que plusieurs audio-guides sont disponibles en différentes langues
|
||
Quand j'accède à la page de sélection
|
||
Alors je peux filtrer par langue
|
||
Et par défaut, les guides dans ma langue système sont affichés en premier
|
||
|
||
Scénario: Réutilisation de l'infrastructure existante
|
||
Étant donné qu'un audio-guide est techniquement un contenu structuré
|
||
Alors il réutilise:
|
||
| composant | usage |
|
||
| OVH Object Storage | Hébergement fichiers MP3 séquences |
|
||
| Streaming HLS | Diffusion audio adaptative |
|
||
| Cache Redis | Métadonnées guides + progressions |
|
||
| PostgreSQL | Stockage structure JSON guides |
|
||
Et aucune infrastructure dédiée n'est nécessaire
|