9.6 KiB
1ter. Chantier « migration Postgres v3 » — ordre de bataille (ajouté le 2026-08-07)
← Section §1ter du tableau de bord : STATUS.md
Postgres n'est pas encore en prod. Trois chantiers ont été analysés le 2026-08-07 et découpés selon une règle unique :
Ce qui touche aux données déjà écrites part avec la migration. Ce qui est purement additif attend.
Chaque ligne est faite pour être attaquée dans une conversation dédiée : lire le doc, faire l'étape.
⚠️ Cette section dit ce qui doit entrer dans le schéma, pas comment on remplit la base. L'opération de bascule elle-même — et l'état de
MigrationController— sont au §1quinquies.
Doit partir avec la migration (schéma — quelques heures)
| # | Quoi | Doc | Pourquoi maintenant |
|---|---|---|---|
| 1 | ✅ Fait 2026-08-09 — Image Docker postgis + pgvector (Deployment/Dockerfile.postgres, digest épinglé) |
v2/rag-pgvector-integration-plan.md | Base vide = 4 lignes de Dockerfile. Plus tard = fenêtre de maintenance sur la prod |
| 2 | ✅ Fait 2026-08-09 — Table ContentEmbedding + index HNSW |
idem | Table vide, ne dérange personne. Additif mais gratuit maintenant |
| 3 | ✅ Fait 2026-08-09 — IEmbeddingService + GoogleEmbeddingService, dimension 768 validée contre l'API réelle |
idem | Gèle la dimension du vecteur — décision de schéma, à valider avant la migration |
| 4 | ✅ Fait 2026-08-09 — Colonnes Resource : StoragePath, FileName, IncludeInAiKnowledge, AiIndexStatus… (SizeBytes existait déjà) |
v2/media-storage-plan.md | Les URL Firebase absolues sont dispersées jusque dans le JSONB des sections |
| 5 | Backfill SizeBytes + StoragePath + inventaire des blobs orphelins |
idem | La migration touche déjà chaque ligne Resource |
| 6 | Flag watermark sur Instance (+ exposition dans la config) |
idem | Remplace un if sur un id d'instance codé en dur |
Avant la release, hors schéma
| # | Quoi | Doc |
|---|---|---|
| 7 | Compression images côté client — 2560 px / JPEG q82, ~12× de gain | v2/media-storage-plan.md |
| 8 | Alerte de budget GCP (5 min) | idem |
| 9 | Quota : pré-vol + contrôle autoritaire à Create + Delete du blob |
idem |
Bugs découverts — indépendants de la migration
| # | Quoi | Doc |
|---|---|---|
| 10 | Visite hors ligne quasi non fonctionnelle — le switch de collecte des ressources est commenté côté backend et côté visitapp : ni images d'articles, ni audios |
v2/offline-visit-plan.md |
| 11 | Ressource modifiée jamais re-téléchargée (filtre sur la présence, pas la version) | idem |
| 12 | audio/mpeg absent de la table d'extensions → MP3 probablement en .unknown |
idem |
| 13 | Purge des fichiers obsolètes désactivée sur le device | idem |
V1 — après la migration (décidé le 2026-08-07)
Le RAG est dans la V1, dans son périmètre restreint : IVectorStoreService, jobs Hangfire sur le contenu CMS, endpoint /ask, et l'écran Guide IA dans manager-app. Pas d'ingestion documentaire, pas d'OCR, pas de TTS — c'est ce qui le rend tenable.
Deux écrans manager-app sont spécifiés et maquettés :
| Écran | Plan | Maquette |
|---|---|---|
| Guide IA — 🔨 onglet Configuration livré le 2026-08-07 | v2/guide-ia-screen-plan.md | https://claude.ai/code/artifact/c43fe02d-3283-48c2-992f-d687e18acdfa |
| Statistiques — 🔨 refonte livrée le 2026-08-07 | v2/stats-screen-plan.md | https://claude.ai/code/artifact/052fe8f3-0288-4847-b63f-4c7de06068ec |
Tableau de chantiers global : https://claude.ai/code/artifact/4c317904-2e23-45d3-ac14-dcca678ae5d3
🔨 Premier morceau livré le 2026-08-07 — migration
AddGuideIaConfigToInstance(4 colonnes nullable, additive), champs surInstance/InstanceDTO, clientmanager_api_newétendu à la main, écranScreens/GuideIa/avec 35 clés i18n FR/EN/NL.dotnet buildetflutter build webpassent.✅
AssistantServicebranché sur la configuration le 2026-08-07 — l'écran ne pilote plus dans le vide. C'est le lot 1 du §1quater ci-dessous, qui donne l'ordre d'exécution de tout le chantier Guide IA.📄 Repartir de zéro dans une conversation neuve : ordre de lecture et amorce à copier dans v2/guide-ia-screen-plan.md § « Reprendre ce chantier dans une conversation neuve ».
Relevé en vérifiant : tout le system prompt est codé en dur, dans deux blocs…Corrigé le 2026-08-07. Il y avait en fait quatre blocs de prompt et non deux ; les quatre lisent maintenant la configuration du client. Détail : v2/guide-ia-screen-plan.md.
🔨 Statistiques — refonte livrée le 2026-08-07, export PDF compris,
Screens/Statistics/statistics_screen.dartréécrit, aucun changement backend. Les 7 défauts sont corrigés : barres horizontales monochromes à la place des barres verticales tronquées et des deux anneaux, barre de filtres unique avec les volumes par canal, canaux filtrés sur ceux que l'instance possède réellement, règle mono-canal, 4 KPI portant chacun leur variation, bandeau « à retenir », courbe en aire avec bandes de week-end et survol, bloc rapport avec bouton de téléchargement actif (PDF généré côté client, paquetflutter analyze lib/Screens/Statisticsest propre ;flutter test test/statistics_report_test.dart4/4.⚠️ Rien de tout ça n'a été ouvert dans un navigateur — ni l'écran sur des données réelles, ni le PDF produit. Cases de test : test-plan.md §8bis (écran, 9 cas) et §8ter (export PDF, 6 cas). Trois écarts assumés par rapport au plan (comparaison de période côté client, bandeau généré côté client, « visiteurs uniques » remplacé par « contenus consultés » car non calculable) : détail dans v2/stats-screen-plan.md § État d'implémentation.
ℹ️ Précision sur
flutter analyze: le projet a 68 erreurs, toutes dans les fichiers modèle orphelins demanager_api_new(+lib/api/openApiTest.dart) — c'est la dette « client généré désynchronisé » déjà listée, pas une régression.flutter build webpasse malgré elles : ces fichiers ne sont pas dans le graphe de compilation. Ne pas lire unflutter analyzeglobal comme un feu vert, filtrer sur le dossier travaillé.
⚠️ Point de correction V1 : l'indexation doit respecter IsActive. Une section non publiée ne doit pas être indexée, et la désactiver doit purger ses embeddings — sinon le guide révèle du contenu que le client prépare.
V2 — incréments
Côté IA : ingestion documentaire (PDF/Word/images + OCR Gemini), TTS pré-généré, talking head, génération de visites, guides multiples et guide thématique par section. Détail : v2/rag-pgvector-integration-plan.md.
Côté produit — reporté en V2 le 2026-08-07 (spécifié dans todo-features.md, rien n'en dépend en V1) :
| Chantier | Pourquoi ça peut attendre |
|---|---|
| SectionForm — formulaires personnalisés (feedback, satisfaction, inscription atelier) | Nouveau type de section + table de réponses : purement additif, aucun impact sur le schéma existant |
Ressource 360° — images panoramiques (ResourceType.Panorama360 + package panorama) |
Une valeur d'enum et un branchement dans l'affichage des ressources ; se greffe sans toucher aux sections |
AR image tracking (Mind AR) — modèle ArAnchor, microservice Node de compilation .mind, WebView scanner unifiée QR + image |
Le plus gros des trois : nouveau service Docker, nouveau modèle, refonte du scanner visiteur. Fort effet démo, zéro urgence |
Kiosk web — version Flutter Web de tablet-app |
Aucun client ne le demande. ⚠️ Ne pas confondre avec le visiteur web (visitapp-web), lui déjà écrit et attendu en V1. Mise à jour du 2026-08-12 : l'argument « et tablet-app ne compile pas » est tombé, l'APK est produit depuis K1. |
| Portrait et paysage sur toute la borne — ajouté le 2026-08-12 | tablet-app n'a aucune stratégie d'orientation : les écrans sont écrits pour la forme qu'on leur a vue, et la maquette K3/K7 tranche le paysage pour deux types seulement. Or une borne se monte aussi bien en portrait (totem d'accueil) qu'en paysage (comptoir), et le choix appartient au lieu, pas à l'app. Le chantier n'est donc pas « ajouter le portrait » mais rendre les treize types indifférents à l'orientation — un jeu de points de rupture et une règle unique du type « la colonne de texte reste plafonnée, le rail passe dessous quand la largeur manque ». C'est une repasse UI transversale, pas un correctif : hors V1 pour la même raison que la repasse UI globale de manager-app (DB1). ⚠️ La maquette du 12/08 est compatible — le rail qui tombe sous le texte est exactement le comportement portrait — mais elle ne l'a pas spécifié |
Prochaine chose à faire si tu as 1h : le §21 du plan de test — vérifier sur un device l'état réel de la visite hors ligne. C'est peut-être déjà remonté comme « l'appli marche mal dans le fort » sans que la cause ait été identifiée, et ça conditionne l'urgence des points 10-13.