# 5. Roadmap produit — nouveaux canaux & IA > ← Section **§5** du tableau de bord : [STATUS.md](../STATUS.md) Plans détaillés, pas encore démarrés en dev (sauf mention contraire) : | Chantier | Détail | Statut | |---|---|---| | Kiosk web (Flutter Web, extension tablet-app) | [architecture-web-saas.md](../architecture-web-saas.md) | 📦 **V2** (2026-08-07) — pas commencé, ~2-3j estimés. Aucun client ne l'attend, et `tablet-app` ne compile même pas aujourd'hui | | Visiteur web (Next.js, `app.myinfomate.be/[slug]`) | [architecture-web-saas.md](../architecture-web-saas.md) | ⚠️ **V1, presque fini** — `visitapp-web` existe, build ✅, les 13 types de section sont rendus, assistant IA inclus. **Il ne manque que le Dockerfile + l'entrée `app.myinfomate.be` dans le compose.** Bloquant : le plan Essentiel vendu par l'onboarding est web-only | | Export PDF stats — **à la demande** | [plan-import-ia-stats-subsides.md](../plan-import-ia-stats-subsides.md) §1 | ✅ **Livré le 2026-08-07**, généré côté client (paquet `pdf` Dart), aucun changement backend. **Inclus dans tous les plans qui ont les stats** (décidé le 09/08) — la différenciation vient du contenu, pas d'un verrou | | Historique des stats — **13 mois pour tous** | idem · [todo-features.md](../todo-features.md) § Plans & Quotas | ✅ **Décidé et appliqué le 2026-08-09**. L'axe « durée » disparaît, `HasAdvancedStats` devient le seul différenciateur stats. Migration `UnifyStatsRetentionTo13Months` **à appliquer**. Purge codée mais inactive jusqu'au pg_dump | | Export PDF stats — **envoi mensuel automatique** | idem | v2. C'est là que QuestPDF + Hangfire reprennent leur sens. Manquent : config destinataires/fréquence, méthode d'envoi avec pièce jointe, et `libfontconfig1` au Dockerfile | | Import IA de contenu + RAG (pgvector) | [plan-import-ia-stats-subsides.md](../plan-import-ia-stats-subsides.md), [v2/rag-pgvector-integration-plan.md](../v2/rag-pgvector-integration-plan.md) | Priorité 2 — chantier fusionné, ~4-6 semaines. **Le schéma part avec la migration v3, voir §1ter** | | Médias & stockage (compression, `IStorageService`, quota) | [v2/media-storage-plan.md](../v2/media-storage-plan.md) | **Prérequis à la release de migration** — voir §1ter | | Visite hors ligne — remise en état | [v2/offline-visit-plan.md](../v2/offline-visit-plan.md) | **Bugs**, pas de la roadmap — voir §1ter | | Écran Guide IA (manager-app) | [v2/guide-ia-screen-plan.md](../v2/guide-ia-screen-plan.md) | **V1**, spécifié et maquetté — voir §1ter | | Écran Statistiques — refonte | [v2/stats-screen-plan.md](../v2/stats-screen-plan.md) | ✅ **Livré le 2026-08-07**, export PDF à la demande compris — les 7 défauts corrigés. **Pas encore ouvert dans un navigateur** : [test-plan.md §8bis et §8ter](../test-plan.md) | | TTS pré-généré (audioguide multilingue) | [v2/tts-pregenerated-plan.md](../v2/tts-pregenerated-plan.md) | Priorité 3. ⚠️ **Trois corrections posées le 2026-09-02** (en-tête du fichier) : le moteur est **Gemini TTS**, pas Cloud TTS — le document disait les deux, le code tranche ; « le visiteur choisit entre Viva et Marco » est remplacé par **un guide adressable + N narrateurs** ; et le stockage s'en trouve **divisé par deux**, pas multiplié. Source de vérité sur les personnages : [v2/studio-plan.md §3.8](../v2/studio-plan.md) | | ~~Talking head (avatar animé)~~ | [v2/talking-head-plan.md](../v2/talking-head-plan.md) | ⛔ **ABANDONNÉ le 2026-09-02.** Son lipsync repose sur `enable_time_pointing` de **Google Cloud TTS**, or le code livré tourne sur **Gemini TTS** (`GeminiTtsEngine`, `gemini-2.5-flash-preview-tts`) : aucune source de timestamps. Le plan était sans fondation, pas « à faire ». Remplacé par le portrait canon statique d'un `Persona`, puis une boucle vidéo 6-8 s. En-tête d'abandon posé sur le fichier | | **Médiathèque — refonte de l'onglet Ressources** | ⭐ **[v1-mediatheque-plan.md](../v1-mediatheque-plan.md)** — spec autonome et exécutable, écrite le 2026-09-02 | ⭐ **V1 — prêt à implémenter, sans rien lire du plan Studio.** Rien à voir avec l'IA : renommage en Médiathèque, rail de facettes cumulables (type/usage/origine/configuration), filtre **« jamais utilisée »**, tri, groupement, sélection multiple, et le détail en **panneau latéral** avec la liste « Utilisée dans » — presque gratuite, `GetReferencedResourceIds` existe déjà sur les 13 sous-types. 🐛 Corrige deux bugs : le téléchargement forcé en `.json` quel que soit le type (`show_resource_popup.dart:91`) et `Resource.FileName` absent de `ToDTO()`. **Aucune clé API, aucun coût variable — meilleur ratio valeur/risque du chantier** | | **Module Studio — génération IA d'images/vidéos/3D** | [v2/studio-plan.md](../v2/studio-plan.md) | 📦 **V2 — conception arrêtée le 2026-09-02, rien de codé.** Le produit n'est pas l'accès aux modèles, c'est la **cohérence visuelle à l'échelle d'un projet** : une `VisualIdentity` par instance + surcharge par configuration, injectée côté serveur dans chaque prompt. La génération se greffe sur le **sélecteur de ressource existant** (`showSelectResourceModal` embarque déjà `ResourcesScreen`) — un seul branchement couvre les 13 types de section, les POI et les étapes. MVP = escape game, images seulement. ⛔ **Prérequis dur : le backend ne sait pas écrire dans le bucket** (`IResourceBlobService` n'a que `DeleteAsync`) — lot 0 partagé avec le TTS pré-généré. ⚠️ Trois pièges tranchés : URL Firebase à jeton **publique** (préfixe `studio-drafts/` + proxy authentifié), `CheckQuota` avant/après **ne tient pas** sur des jobs Hangfire parallèles (réservation en deux temps sur `CreditLedger`), et `GuidedStep.ImageUrl` est une URL — les images de l'escape game **ne partiraient pas offline**. 🚫 Pas de watermark gravé : provenance + badge UI | | **Personnages — un guide adressable + N narrateurs** | [v2/studio-plan.md §3.8](../v2/studio-plan.md) | 📦 **V2 — arrêté le 2026-09-02.** **Trois plans décrivaient le même objet sans se croiser** : le canon visuel (studio-plan), les frames de lipsync (talking-head), et `PersonaConfig { WakewordId, GuideName, PersonaPrompt, VoiceName }` (tts-pregenerated). Une entité `Persona` les remplace, et les 4 colonnes `Instance.Guide*` deviennent une ligne. ⚠️ « Le visiteur choisit entre Viva et Marco » était **un choix de voix déguisé en choix de guide** : le besoin réel (modèle Bastogne War Museum) est N narrateurs assignés par le conservateur via `NarratorPersonaId` — ce qui **divise le stockage TTS par deux** au lieu de le multiplier. Le **wakeword devient une exigence du canal mains-libres**, pas une propriété du personnage : ça corrige le bug latent où le visiteur dirait « Marco » à quelqu'un qui se présente comme « Léon ». À ajouter : `Persona.VoicePrompt` (l'intonation, aujourd'hui la **constante de build** `kGeminiTtsPrompt`) et une table `TtsVoice` — deux constantes ne suffisent pas à quatre narrateurs | | AI Persona par venue (guide IA personnalisable) | [v2/myinfomate-ai-persona-analysis.md](../v2/myinfomate-ai-persona-analysis.md) | Architecture de référence pour les chantiers IA ci-dessus | | Lunettes Ray-Ban Meta | [roadmap.md](../roadmap.md) (section XR), [rayban-meta-integration.md](../rayban-meta-integration.md) | 🔨 **POC fonctionnel — bien plus avancé que ce que cette ligne disait jusqu'au 2026-08-09.** Voir §5bis | | VR Meta Quest (borne office tourisme) | [v2/vr-quest-unity-plan.md](../v2/vr-quest-unity-plan.md) · [roadmap.md](../roadmap.md) (section XR) | 📦 **V2** — ⚠️ **« zéro ligne de code » était faux** (corrigé le 2026-08-31, relevé dans le code). Le canal VR est déjà dans le modèle : `AppType.VR`, `Instance.IsVR` en base depuis juillet 2025, sous-menu « VR » branché dans `main_screen.dart:65`, filtre stats + i18n `statsChannelVR` prêts. **Ce qui manque** : l'écran de flotte (`main_screen.dart:704` = `Text("TODO vr")`), un `Device.AppType` (le `DeviceController` est hardcodé sur `Tablet`), et l'app Unity. Back-office XR : **8-12 j**. App Unity : **3-4 mois**. La landing annonce « Meta Quest — Bientôt » en 4 langues (`translations.ts`, clé `mode4Desc`) | | Canal subsides | [plan-import-ia-stats-subsides.md](../plan-import-ia-stats-subsides.md) | Actions administratives/réseau, pas de dev | ---