La limite demandée existe déjà deux fois — le solde prépayé est le plafond, et
StudioPerUserDailyCap borne la journée d'un utilisateur. Ce qui manque est
l'alerte : aujourd'hui le premier signal reçu est une génération qui échoue en
InsufficientCredits, et l'expiration à 12 mois fait s'évaporer un solde sans
prévenir. Seuil configurable par instance, mail au franchissement et rappel
d'expiration à J-30.
Carte kanban 282.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deux recadrages par rapport à la demande initiale : le déclencheur n'est pas un
POI (qui est un point sur un GLB) mais une Section, au même endroit que le
beacon ; et l'indirection code → section n'a aucun équivalent existant à
réutiliser — en v1 le tag porte la même URL que le QR, donc zéro entité, zéro
endpoint.
Le vrai coût est ailleurs : ni Universal Links ni App Links n'existent sur nos
domaines, et ce lot-là profite autant au QR, qu'un appareil photo natif n'ouvre
pas dans l'app aujourd'hui. Dépend du déploiement de visitapp-web pour le
fallback sans app installée.
Carte kanban 265.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Relevé dans le code le 2026-09-16. Même cause pour les quatre : XR-2 a réutilisé
AppConfigurationLinkScreen tel quel, et cet écran sert quatre canaux qui n'ont
pas les mêmes réglages. Le sélecteur bento ne pilote rien en VR (les spans sont
portés par le lien de configuration, pas par les sections), la notification
annonce « application mobile », la popup d'édition d'un casque est celle du
kiosk avec la moitié des champs morte, et un bento VR suppose des spans par
section jusque dans Unity.
Plan dans v2/vr-menu-bento-plan.md, carte kanban 340.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le plan de test gagne un § 0bis : le lot 0 a réécrit tout le chemin d'upload
(URL V4 signée puis POST /ingest) et rien n'a jamais été déposé depuis un
navigateur, alors que les § 1 à 5 en dépendent tous. Ajout aussi de l'ordre de
passage en quatre séances, de la façon de reporter un échec, et des résultats
déjà obtenus sur le § 0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Carte 315 : mention IA du lot 6 absente en VR, audio narré et casting à porter, couture ScenePersona vers Persona, Parcours probablement vide sur le casque (à vérifier). Plan et STATUS à jour.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011VxSQeGQYUvPmSEoGdnidA
Résultats du calibrage (61 générations, coûts recoupés sur l'export fal),
trois corrections de prompt, unité 1 crédit = 0,015 $ vendue avec marge,
échantillons et figures d'archétypes embarqués ; planches contact dans
outputs/studio-calibrage-2026-09-15. STATUS, roadmap, cartes 280 et 310 à jour.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011VxSQeGQYUvPmSEoGdnidA
Plafond dur organisation retire : avec des credits prepayes, le solde est deja
le plafond. SubscriptionPlan.HasStudio / StudioCreditsGranted et
Instance.StudioProviderRegion ne sont pas crees tant que rien ne les lit. API
credits, schema et etapes du lot 1 alignes sur le code.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
studio-plan.md : section 8 executable pour les lots 0 a 4 (prerequis, etapes,
verifications, gate) et section 9 catalogue v0 (styles, preambule, gabarits,
calibrage). Decisions 14 a 21 : upload par URL signee et ingestion serveur,
MVP texte + image source sur objets et lieux, prix differes et Grant manuel,
une recharge prolonge tout le solde, plafonds d'upload par type, catalogue
calibre fin de lot 3, lignage en colonnes, contrat fournisseur multi-fichier.
Corrige les contradictions laissees par les revisions : Kind retire de
Persona, talking head, API credits, webhook fal.ai signe en ED25519 et non en
HMAC, enum ResourceType deja etendu. Les noms suivent le code du lot 0
(ResourceIngestionService, GetInfoAsync, ReadAllAsync).
immersif-frontiere-plan.md : decisions 1, 4 et 6 marquees reportees.
Kanban : cartes 280 et 300 a jour, carte 305 sur le watermark inactif depuis
l'upload direct.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- outputs/platform, outputs/prospect : scripts de construction des decks
commerciaux + captures sources et .pptx generes.
- outputs/mnaha : seed complet de l'instance de demo luxembourgeoise
(scripts par etape, contenus, images generees), le deck en version
marque blanche et en version brandee, le PDF de presentation.
- outputs/Wireframes : maquettes app mobile, app web et manager.
- interview clients : notes de l'entretien Fourneau St Michel.
state.json et les __pycache__ sont ignores : le premier porte les cles
d'API de l'instance seedee, les scripts le regenerent.
Les deux plans se renvoyaient la balle exactement sur la zone a
construire : studio-plan mettait la 3D en lot 11 en disant "depend du
chantier VR", et vr-quest-unity-plan decrivait les POI sur GLB en
supposant un GLB qui arrive de quelque part. Nouveau document de
frontiere, plus les corrections qu'il impose au plan Studio.
v2/immersif-frontiere-plan.md (neuf)
- Trois couches separees : ressources immersives (360/GLB, se vendent
sans casque), consommation (SectionModel3D, ImmersiveBackground, app
Quest), et le Studio comme *source d'approvisionnement* de la couche 1
et non module parallele.
- Pas d'add-on casque : un seul add-on "Contenu immersif" a 70 EUR, plus
le hardware et l'onboarding one-shot. Reconfirme l'arbitrage du 31/08.
- Generation de scene : position revisee. Marble (World Labs) a une API
depuis janvier 2026, ~0,12 $ le monde draft, export GLB. Cadre retenu
= roomscale stationnaire ~3 m, pas d'environnement navigable : ~500k
splats de plafond sur Quest 3 standalone, et un cas mesure a 12 fps
sous Unity la ou une borne doit tenir 72.
- 11 decisions de retro-compat ordonnees par cout de retrofit. Les cinq
premieres touchent des lots ANTERIEURS a la 3D : pipeline d'ingestion
unique (l'upload est fait par le navigateur, donc un GLB uploade ne
traverse aucun traitement alors qu'un GLB genere si), normalisation
canonique des GLB, invalidation des POI, lignage en colonnes typees,
renommage des credits.
- Mecaniques de jeu immersives notees, rien de planifie : repondre
(SectionQuiz existe deja), trouver (marche aussi en web sur pano
pivotant, donc se vend sans casque), ordonner
(OrderedTranslationAndResource existe deja), avant/apres.
v2/studio-plan.md
- ImageCredits* -> StudioCredits* : une 3D coute 10 a 50 fois une image,
le nom aurait menti des le lot 11.
- Credits rechargeables a expiration 12 mois au lieu d'un quota mensuel.
Un musee genere 200 images en trois semaines pour une expo puis rien
pendant cinq mois ; un forfait mensuel se gaspille dix mois sur douze.
Le CreditLedger encaisse sans changement de structure.
- Le critere qui separe les deux monnaies, verifie dans le code :
consomme en temps reel par le visiteur (chat, vocal) contre produit
une fois par le client (images, 3D, video, TTS pre-genere). Le TTS
passe donc cote Studio. Au passage : reindex et insights ne debitent
rien alors qu'ils coutent.
- Lot 11 ne renvoie plus en boucle au plan VR.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Suite du chantier ouvert le 09/09 : 20 des 21 actions de l'audit sont faites.
Depuis le dernier commit : pages /marches-publics, /borne-kiosk et
/visite-hors-ligne en 4 langues, blog /fr/ressources, comparatifs sourcés
Smartify et STQRY, pages légales passées sous /{lang}/, sharp en dépendance.
Deux arbitrages de Thomas consignés :
- témoignages clients écartés (il ne souhaite pas solliciter les clients) ;
- deux pages XR à prévoir, /lunettes-connectees ET /casque-vr, à écrire
seulement quand chaque module sera démontrable (nouvelle carte kanban 335).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le §23 couvre les réglages du manager, les trois formats de QR (id
brut du Fort, URL MDLF, nouvelle URL /download), la page de
téléchargement et les notifications de proximité. §9 mis à jour :
au premier plan c'est la popup, la notification n'arrive qu'écran
verrouillé, et meterZoneGPS sert aux zones GPS, pas aux beacons.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ouvre le chantier 5ter : actions 1 à 9 faites le 10/09 (titres, schema
Organization, llms.txt, prérendu statique rétabli, page /tarifs, page
/assistant-ia dans les 4 langues). Vitrine LinkedIn créée, série de
posts rédigée — en deux vagues, celle qui pousse à l'inscription
attend la prod et un onboarding testé.
Les CGU sont publiées, ce qui clôt le lien mort de la case de
consentement de /signup : ce fichier reste la source, la page de la
landing en est le rendu. Corrige au passage deux passages qui citaient
les plans abandonnés (Starter/Standard) et réservaient l'IA à
« Standard et Premium ». La validation juridique reste due — elle a
sa carte.
Frais de mise en place : arbitré, aucun montant affiché ; la note et
la FAQ disent que le chiffrage arrive avant signature.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le pré-vol de quota et la suppression du blob sont livrés. Le contrôle
autoritaire à Create ne peut pas exister tel qu'il était écrit :
manager-app crée la ligne en annonçant sizeBytes puis téléverse, donc
il n'y a aucun blob à interroger à cet instant.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ni Google ni Mapbox ne donnent un fond hors ligne gratuit, et Mapbox
se facture au nombre de tuiles, pas à la surface. Pour un musée de
plein air comme le Fourneau Saint-Michel, la réponse est son propre
plan dessiné : les repères se posent sur l'image, le plan est une
Resource, donc embarqué par le pipeline hors ligne existant.
Conception seule, rien n'est implémenté. Mapbox est passé fournisseur
par défaut le 04/09.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
flutter_meta_wearables_dat 0.9.1 et app_links remplacent les
dépendances « à décommenter quand publiées ». Le SDK natif vit sur
GitHub Packages : sans PAT read:packages dans local.properties, le
build tombe en 401 — et un token expiré peut passer inaperçu, Gradle
servant son cache.
Note ce que le SDK ne donne pas (ni micro, ni haut-parleur, ni bouton :
le vocal passe par le routage Bluetooth) et pourquoi iOS n'est pas
activé.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
§21.1 bis — 9 cas ajoutés avec le portage du téléchargement dans le
bento (home_3.0.dart, 08/09), dont le piège du fetch qui échoue en
mode avion et laisse les visites téléchargées affichées en « ↓ ».
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Suivi de la session du 07/09 : scripts de dump dans manager-service,
bucket unov-myinfomate-backups en EU, versioning activé sur le bucket
des médias, 1,43 Go recopiés. rclone n'est pas installé sur le VPS :
rien ne part encore hors site, la case reste ouverte.
Clôt la carte « destination des sauvegardes », ouvre celle du
branchement de notify.sh sur un canal réel.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Clos : GET /api/Instance/{id} renvoyait 403 à l'app visiteur. Une clé API donne
maintenant accès à sa seule instance, en vue réduite — plan, quotas, TVA,
facturation et pinCode retirés. Déployé en version-3.1.3 et vérifié en préprod
sur cinq cas d'autorisation.
La carte close garde le piège qui vaut pour tout le projet : le test « est-ce un
utilisateur du manager » ne peut pas se baser sur un claim de permission, parce
qu'AuthorizationMiddleware peuple HttpContext.User depuis le schéma ApiKey avant
de court-circuiter sur [AllowAnonymous]. Et elle rectifie une affirmation fausse
de la première rédaction : StripeCustomerId n'est pas exposé par ToDTO.
Nouveau, en Urgent : GET /api/Configuration répond 200 sans aucune clé. Ce n'est
pas une clé mal vérifiée mais un [AllowAnonymous] explicite, probablement hérité
de la v2. Le périmètre exact reste à établir — les autres routes que consomment
les apps visiteur n'ont pas été passées en revue.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
STATUS.md portait encore le lot J et D5 comme à faire, et son « 📍 Reprendre ici »
datait du 10/08 alors que ses trois étapes sont terminées : il est marqué périmé
et renvoie vers v1-plan.md. La ligne « mode offline » du §1 décrivait un pipeline
commenté, corrigé depuis D1 puis D5.
Nouveau § qui consolide la journée : les lots F et J clos, et les cinq pièges
rencontrés — la garde du proactif qui aurait coûté des jetons pour rien, l'écran
de téléchargement qui ne concluait jamais, le choix de voix du client jamais
honoré, les trois écrans qui journalisaient de fausses questions de visiteur, et
le même code copié trois fois ne portant sa décision qu'une seule.
Kanban : le bandeau annonce que le dev V1 est clos. Compteurs mesurés — Fait
récemment 60, aucun bug ouvert. Republié sur l'artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Purge du journal d'audit (poste oublié à la première passe), mention visiteurs
dans visitapp-web, _toLangCode dédoublonné. Ce qui reste au lot J est juridique :
relecture du §8, conditions réelles de Google, DPA séparé, et les traductions
relues de la mention.
Kanban : Fait récemment 60. ⚠️ Les colonnes À tester et Planifié ont bougé du
fait d'une autre session travaillant en parallèle dans ce repo — ses compteurs
sont cohérents, je n'y ai pas touché.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
⚠️ Travail d'une autre session, committé tel quel pour ne pas le laisser en
working tree. Il n'est pas de cette session-ci et n'a pas été relu ici.
Deux constats qui touchent le travail livré aujourd'hui : l'assistant vocal ne
parle réellement que FR/NL/EN/DE et retombe silencieusement sur le français, et
les commandes vocales cherchent des mots français en dur dans les quatre langues.
Le volet codable du lot J est fait (agrégats de thèmes, job de regroupement,
interrupteur de collecte, mention visiteurs) et D5 avec lui. Ce qui reste au lot J
est juridique : relecture du §8, conditions réelles de Google, DPA séparé — plus
les 7 traductions de la mention, à commander avec cette relecture.
Kanban : la carte D5 et la carte RGPD quittent leurs colonnes, Bugs ouverts tombe
à 0. Compteurs mesurés : Planifié 22, Fait récemment 59. Republié sur l'artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Canal vocal livré, et L9 refermé : la « cible Assistant / Persona » du Mode
preview est exactement ce que le §5 du Guide IA a livré le 11/08 — ce n'était pas
un chantier mais un malentendu entre deux documents. Les trois autres cibles du
Mode preview restent hors V1.
Kanban : la carte du canal vocal quitte Planifié, qui retombe à 22. Compteurs
mesurés : Fait récemment 57. Republié sur l'artifact.
Reste avant la bascule : lot J (RGPD), K6, K9, lot H (tests dont D0), D5, lot I.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
La carte quitte Planifié, qui retombe à 23. Compteurs mesurés : Fait récemment 56.
Kanban republié sur l'artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Plan, STATUS et kanban répercutent le correctif des trois repos. La carte quitte
Bugs ouverts, qui retombe à 1 (les échecs de téléchargement silencieux, D5).
Compteurs mesurés : Bugs ouverts 1, Planifié 24, Fait récemment 55.
Kanban republié sur l'artifact.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
La version publiée était restée au 12/08 (Planifié 26, Fait 48). Le fichier local
était strictement en avance — il contenait déjà les 3 cartes V2 de l'autre
session — donc rien à fusionner, pas de force.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ce qui a été livré côté mymuseum-visitapp est répercuté dans le plan, STATUS et
le kanban. Trois corrections de docs, toutes vérifiées dans le code :
- Meta-Rayban-Test et AI-Assistant-test sont les branches de travail à jour, pas
des POC. Le §5bis affirmait le contraire et c'est ce qui avait fabriqué la
réserve « à clarifier avant K6 ». Il n'y a rien à clarifier.
- « L'APK se construit sans le POC dedans » était faux : les 4 erreurs Dart
étaient dans deux ancêtres morts, pas dans le POC vivant, qui est bien
embarqué. Conséquence inverse de celle qui était écrite — « démontrable » ne
demandait pas de remettre les secrets ElevenLabs.
- « TTS = ElevenLabs, basculer sur Gemini avant de vendre l'add-on » : déjà fait.
constants.dart dit « ElevenLabs retiré du pipeline (trop cher) ».
Nouveau, et non résolu : les déclenchements proactifs écriraient leur prompt
machine dans VisitorQuestion, donc dans l'onglet « Ce que demandent vos
visiteurs » — et gonfleraient le bloc « questions sans réponse ». Même famille
que WeatherSyncService noyant le journal d'audit. Carte en Bugs ouverts, à
traiter dans manager-service puis mymuseum-visitapp avant d'allumer le mode.
D0 — périmètre ramené aux 15 cas d'origine : aucun visiteur n'a l'app installée
et la consigne est « supprimer puis réinstaller ». Vérifié que _onCreate contient
déjà dateUpdate, donc une installation neuve naît en v4 sans passer par
_onUpgrade. Le code qui gère les .unknown reste, il ne coûte rien. Et 21.2.1 est
réécrit : il testait un scénario impossible, remplacer une image créant un
nouvel id.
Kanban : M3 fermé, la carte proactif devient un bug bloquant, trois entrées en
Fait. Compteurs mesurés — Bugs ouverts 2, Planifié 24, Fait récemment 54.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le volet manager-service du lot F est refermé, plus le bouton du portail,
le diviseur de questions et la FAQ de la landing.
Ce que la vérification dans le code a corrigé dans les docs :
- la ligne « À faire » du §1 de STATUS était périmée sur six points. Le
rate limiting y figurait comme à faire alors qu'il est livré (politique,
UseRateLimiter et les deux endpoints décorés), tout comme l'écran d'audit
log, la gestion des users et ParcoursIds. L'unification QuestionType n'est
pas « à faire » mais écartée.
- l'endpoint de mise à jour d'ApplicationInstance n'a jamais manqué : le CRUD
est complet. Ce qui manque est l'écran SuperAdmin, déjà parqué en V2.
- les quotas seed 5M/20M étaient déjà alignés.
Kanban : la carte du portail est close, deux entrées entrent dans Fait
récemment. Compteurs re-mesurés — Planifié 25, Fait récemment 51 —
colonnes et bandeau vérifiés l'un contre l'autre, jamais par delta.
Ce commit emporte aussi les 3 cartes V2 stagées par une autre session
(nettoyage downloadConfiguration, swagger périmés, colonne path écrasée) :
elles vivent dans le même fichier kanban.html.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
356 lignes couvrant ce qui a été livré sur manager-app et jamais ouvert dans un
navigateur : écran Guide IA, éditeur de parcours refondu, écran d'audit log,
compteur d'utilisateurs, compression des images.
Le fichier n'était pas suivi par git — un add explicite ne l'avait jamais vu,
et il serait resté sur un seul disque.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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 <noreply@anthropic.com>
La compression d'images est livrée depuis ce matin mais sa carte était
toujours dans la colonne Migration v3 : j'avais ajouté le done-item sans
retirer la carte. Relevé par relecture, pas par le contrôle de
cohérence — les compteurs étaient justes, ils comptaient simplement une
carte qui n'avait plus lieu d'être.
C'est la limite du contrôle automatique : il vérifie que le nombre
annoncé égale le nombre réel, pas qu'une carte encore ouverte décrit un
chantier encore ouvert. Rien ne remplace la relecture des titres.
Migration v3 passe à 1 carte — il ne reste que C6, le retrait de la
suppression de blob côté manager-app, qui attend I9 à juste titre : tant
que Firebase:StorageBucket est vide, le serveur ne supprime rien et ce
code client est le seul qui nettoie encore.
Vérification faite sur les autres colonnes : aucune autre carte ne décrit
un chantier livré aujourd'hui. K3, K5, K7 et K8 avaient bien été
retirées.
Compteurs recalés par mesure, six colonnes cohérentes, 40 cartes,
44 done-items. Artifact republié.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ce commit porte deux sessions à la fois — voir la note de collision en
fin de message.
C4 — compression des images à l'upload, flutter build web vert. Un seul
helper appelé par les deux chemins d'upload de resources_screen, le
motif exact qui a fait diverger Create et Upload côté serveur en C1 puis
en C3. La compression se fait avant resourceCreate parce que le pré-vol
de quota de C3 porte sur sizeBytes à la création. Écart assumé à
l'énoncé « JPEG q82 » : un PNG à canal alpha reste un PNG, sinon la
transparence se remplit de noir. Défaut préexistant trouvé au passage :
le second chemin d'upload ne renseignait sizeBytes ni avant ni après,
donc tout ce qui est passé par là compte 0 octet au quota.
K8 — retour à l'accueil après 5 min, flutter build apk vert. Écrit une
seule fois dans section_page_detail, qui enveloppe les treize types.
Le retour passe par le même dispose, donc il émet un sectionLeave avec
sa durée réelle : K8 répare une statistique en plus d'un écran.
Checklist D0 ajoutée — DOCS/claude design/checklist-d0-offline.html.
Les 15 cas du §21, chaque groupe relié au bug qu'il décide : 21.2 tranche
D2 et D4, 21.1.4 tranche D3, 21.4.1 tranche D5. Les cas 21.1.2/3/5/6 sont
la première vérification RÉELLE de D1, corrigé le 11/08 mais validé par
l'analyse seule. Si tout passe, le lot D se ferme et le plan perd un à
deux jours — c'est le lien L11.
COLLISION SUR DOCS, à retenir. La session manager-service avait des
modifications stagées et non commitées sur STATUS.md, kanban.html et
v1-plan.md, alors que son prompt lui demandait de ne pas toucher à
DOCS/. Rien n'est perdu : ses changements et les miens coexistent, et
ils sont tous dans ce commit — deux cartes ferées de son côté (tests du
RAG, dettes serveur audit & plafond users) plus ses done-items.
Ce que ça a produit : mes compteurs de kanban étaient calculés par
arithmétique à partir d'un état déjà périmé, donc faux de trois cartes.
Ils sont désormais recalés sur la MESURE — on compte les <article> et on
écrit le résultat, on ne raisonne plus par delta. Planifié 19, six
colonnes cohérentes, 44 done-items, bandeau et libellé alignés.
Leçon pour la suite : un compteur dérivé d'un delta est faux dès qu'une
autre main touche le fichier. Mesurer, toujours.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
flutter build apk --debug vert, APK produit. SectionArticle et
SectionEvent sont branchés dans main_view.getContent ; seul
SectionParcours reste dehors, et définitivement.
Quatre choses que l'implémentation a corrigées ou apprises, toutes
reportées dans le plan, STATUS et la maquette :
- La barre de pied de la maquette n'appartient pas aux écrans.
section_page_detail la dessine déjà pour les treize types, avec les
clés back/menu selon isFromMenu. La dessiner aurait affiché deux
boutons retour. La maquette est corrigée sur ce point.
- Un seul constructeur de marqueurs au lieu des quatre de mymuseum.
MapAnnotationDTO et MapAnnotation ont des champs rigoureusement
identiques mais sont deux types Dart distincts. Normalisé par une
classe interne — L5 appliqué au front, et il porte d'autant plus que
la convention [lng, lat] est l'endroit exact où une divergence ne
lève aucune erreur.
- L'audio d'article se résout dans contents avant l'API, donc sans
appel réseau quand il est embarqué, donc hors ligne aussi. Mymuseum
appelle l'API systématiquement en ligne.
- Clé i18n event.live ajoutée aux 10 langues. Sans les 10,
getFromLocale renvoie "" et la pastille rendrait une boîte vide.
PL, CN, UK et AR sont de ma main et demandent une relecture humaine.
Ce qui n'est pas prouvé, et qui est écrit comme tel : le rendu. Aucun
des deux écrans n'a été vu à l'œil — un build vert ne dit rien d'une
mise en page, c'est la leçon du §1bis appliquée au design. Et aucun
SectionEvent n'existe en base, le type étant né avec Postgres v3 : le
§19.13 cas E en créera un.
Kanban : la carte « Types de section manquants sur le kiosk » quitte
Urgent (2 -> 1) pour Fait récemment (40 -> 41), bandeau du haut et
libellé « Quarante et un » compris. Compteurs des six colonnes
revérifiés un à un.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Correction d'une affirmation fausse écrite plus tôt dans la journée et
reprise dans la maquette, le plan et une décision validée : « tablet-app
n'a aucun i18n ». Il en a un — lib/Helpers/translations.dart, table de 10
langues (FR EN NL DE IT ES PL CN AR UK), ~150 entrées, lue par
TranslationHelper.getFromLocale à 19 endroits, avec déjà une clé back.
Ce n'est pas de l'ARB : chercher l10n/ ou AppLocalizations ne le trouve
pas, alors que le CLAUDE.md du repo le décrit.
Ce que ça change : le motif donné pour « hors dates, aucune prose » — un
bandeau serait français pour un néerlandophone — était faux. Un libellé
traduit coûte une clé × 10 langues. La règle reste défendable (rien à
traduire vaut mieux que quelque chose à traduire) mais devient un choix,
pas une contrainte. À reconfirmer.
Corollaire d'implémentation : le bouton Retour des deux écrans passe par
la clé back existante, il ne s'écrit pas en dur.
Ajouté en V2 — portrait et paysage sur toute la borne. tablet-app n'a
aucune stratégie d'orientation : chaque écran est écrit pour la forme
qu'on lui a vue, et la maquette du 12/08 ne tranche que le paysage, pour
deux types. Une borne se monte pourtant aussi bien en totem qu'en
comptoir, et le choix appartient au lieu. Le chantier n'est pas
« ajouter le portrait » mais rendre les treize types indifférents à
l'orientation — repasse UI transversale, même famille que la repasse
globale de manager-app. La maquette est compatible (le rail qui tombe
sous le texte est le comportement portrait) mais ne le spécifie pas.
Kanban : carte V2 ajoutée, Planifié 21 -> 22 (colonne et bandeau). Le
motif « et tablet-app ne compile même plus » de la carte Kiosk web est
corrigé — il est tombé avec K1.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>