From 83bc8c51ada5c9b326eedf1a6fcabe4bcdfeb6fb Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Wed, 12 Aug 2026 17:47:34 +0200 Subject: [PATCH] =?UTF-8?q?Arbitrages=20du=2012/08,=20D2=20livr=C3=A9,=20e?= =?UTF-8?q?t=20deux=20docs=20qui=20affirmaient=20du=20faux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Décidé et inscrit : thèmes du lot J complets (job + table d'agrégats, donc le §8.4 des CGU n'est pas à amender), meterZoneGPS sur mymuseum et visitapp-web, D3/D4 sans attendre D0, rate limiting et Customer Portal confirmés V1, lunettes Ray-Ban ramenées en V1, K9 (repasse visuelle de la borne, bento compris), déclenchement proactif ouvert à tous, miroir de la conversation vocale. Trois lignes du plan étaient périmées : le nettoyage de manager_api_new et la sécurité du lot A sont faits depuis un moment, et un PUT ApplicationInstance existe déjà. Deux documents affirmaient un fallback Voice vers Mobile qui n'existe pas — guide-ia-screen-plan.md et le commentaire d'AiController se confirmaient mutuellement. Le code fait un FirstOrDefault sur le canal exact puis Forbid() : envoyer AppType.Voice au chat sans ApplicationInstance de ce type rendrait 403 à chaque question. Corrigé côté doc ; le commentaire reste à corriger. Le vocal n'est donc pas un canal mais un attribut : marqué dans VisitEvent.Metadata, colonne JSON déjà existante, aucune migration. AppTypeDistribution compte une entrée par session et tranche sur l'événement le plus ancien — avec le miroir, une session est mixte, et un canal Voice aurait mesuré « sessions démarrées en vocal », pas la part du vocal. Co-Authored-By: Claude Opus 5 --- STATUS.md | 14 + kanban.html | 623 ++++++++++++++++++++----------------- v1-plan.md | 35 ++- v2/guide-ia-screen-plan.md | 2 +- 4 files changed, 381 insertions(+), 293 deletions(-) diff --git a/STATUS.md b/STATUS.md index 7aa3da2..658d3b4 100644 --- a/STATUS.md +++ b/STATUS.md @@ -335,6 +335,20 @@ Restait le contenu réel du lot, les deux avertissements du build : **NDK 27.0.1 **Ce que K5 débloque** : **D0** (test-plan §21 sur device), donc la mesure des bugs offline D2-D5 et la confirmation du volet visiteur de D1 — qui ne tient aujourd'hui que sur `flutter analyze`. +**✅ D2, D3 et D4 livrés le 2026-08-12**, sans attendre D0 (arbitrage du plan : défauts certains, pas des hypothèses à mesurer). `audio/mpeg` ajouté à la table d'extensions, purge des fichiers obsolètes réactivée, et filtre de fraîcheur livré de bout en bout (`dateUpdate` serveur → DTO → client généré → base locale v4). `dotnet test` **205/205**, `flutter build web` (manager-app) ✅, APK `dev` de `mymuseum-visitapp` ✅. **Reste D0 et D5.** + +⚠️ **Deux prémisses du plan étaient fausses, corrigées dans `v1-plan.md`** : +- **« Les deux chemins de téléchargement divergent »** (le motif `Create`/`Upload` de C1/C3, rapproché de D4) : **il n'y a qu'un seul chemin vivant.** Les lignes `328-461` de `downloadConfiguration.dart` sont dans un bloc commenté — le `cleanLocalResources(:455)` cité comme preuve est du code mort, et cette fonction n'est appelée **nulle part**. +- **`cleanLocalResources` n'est pas réactivable telle quelle** : la table locale `resources` n'a **pas de colonne `configurationId`**, elle est globale à toutes les visites téléchargées. L'activer sur les ids d'une seule configuration aurait effacé les lignes des autres. Sans bénéfice, de surcroît : rien ne lit ces lignes pour le rendu, le fichier est retrouvé en listant le répertoire. + +⚠️ **D2 ne réparait pas ce que la doc annonçait — vérifié dans le code le 2026-08-12.** « Une image remplacée dans le CMS ne remonte jamais sur le device » : **ce cas n'existe pas.** `Upload` génère un nouvel id à chaque téléversement, manager-app écrit dans `pictures/{instanceId}/{resourceId}` — remplacer une image donne donc **un nouvel id et une nouvelle URL**, que l'ancien filtre téléchargeait déjà. La popup d'édition ne change que le libellé. **Aucun flux ne réécrit le blob d'un id existant.** + +✅ **Le vrai cas de péremption est celui que D3 vient de créer** : les MP3 déjà sur les devices y sont en `.unknown`, et « le fichier est présent » les déclarait à jour. **Sans D2, D3 ne réparait que les installations neuves** — le parc existant serait resté muet. `isResourceOutdated` traite `.unknown` comme absent. + +⚠️ **Deux pièges tranchés en écrivant D2** : la montée v3 → v4 laisse les dates existantes à `NULL` et les considère **à jour** (backfiller à zéro aurait fait re-télécharger toutes les visites de tous les visiteurs sur leur réseau mobile) ; et la boucle en masse héritée de D1 **écrasait la date** que la boucle de téléchargement venait d'écrire, `DatabaseHelper.insert` faisant un UPDATE de la ligne entière. + +⚠️ **Dette relevée au passage, non traitée** : les trois `lib/api/swagger.yaml` (manager-app, mymuseum-visitapp, tablet-app) sont **périmés** — leur `ResourceDTO` n'a ni `sizeBytes` (C1/C3) ni `dateUpdate`. Ce sont des artefacts de génération, et le client s'édite à la main : ils ne sont plus la source de vérité, mais ils la contredisent en silence. + **✅ K3 et K7 livrés le 2026-08-12 — `flutter build apk --debug` vert, APK produit.** La borne couvre désormais **12 des 13 types** : `SectionArticle` (K7) et `SectionEvent` (K3) sont branchés dans `main_view.getContent`. Seul `SectionParcours` reste dehors, et **définitivement** — un parcours guidé fait marcher le visiteur. Les deux écrans suivent la maquette `DOCS/claude design/kiosk-paysage-article-event.html` : rail média ancré + colonne de lecture plafonnée pour l'article, bande héros à 26 % + programme + carte vive pour l'événement, détail d'un bloc **sous la carte** plutôt qu'en `showModalBottomSheet`. diff --git a/kanban.html b/kanban.html index 3f78915..da49790 100644 --- a/kanban.html +++ b/kanban.html @@ -1,5 +1,5 @@ - -MyInfoMate — Tableau de chantiers + +MyInfoMate — Tableau de chantiers