Le lot F est clos
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>
This commit is contained in:
parent
c0308a95c0
commit
fd5e1d7b3c
31
kanban.html
31
kanban.html
@ -458,9 +458,9 @@
|
||||
<div class="stat"><span class="n n-info">1</span><span class="k">Migration v3</span></div>
|
||||
<div class="stat"><span class="n n-warn">1</span><span class="k">Bugs ouverts</span></div>
|
||||
<div class="stat"><span class="n">6</span><span class="k">À tester</span></div>
|
||||
<div class="stat"><span class="n">23</span><span class="k">Planifié</span></div>
|
||||
<div class="stat"><span class="n">22</span><span class="k">Planifié</span></div>
|
||||
<div class="stat"><span class="n n-gate">8</span><span class="k">Bascule prod</span></div>
|
||||
<div class="stat"><span class="n n-good">56</span><span class="k">Fait récemment</span></div>
|
||||
<div class="stat"><span class="n n-good">57</span><span class="k">Fait récemment</span></div>
|
||||
</section>
|
||||
|
||||
<div class="filters" role="group" aria-label="Filtrer par domaine">
|
||||
@ -584,7 +584,7 @@
|
||||
|
||||
<!-- PLANIFIÉ -->
|
||||
<section class="col" style="--stripe: var(--ink-3)">
|
||||
<div class="col-head"><h2>Planifié</h2><span class="count">23</span></div>
|
||||
<div class="col-head"><h2>Planifié</h2><span class="count">22</span></div>
|
||||
|
||||
|
||||
<div class="stack">
|
||||
@ -755,24 +755,10 @@
|
||||
<article class="card" data-area="doc" data-horizon="v2">
|
||||
<div class="card-meta"><span class="tag">XR</span><span class="flag f-warn">V2 · subventionné</span></div>
|
||||
<h3>Meta Quest — borne VR</h3>
|
||||
<p>Pilote presse uniquement, quand le SDK sort de preview. Profil d'appel à projets, pas de ligne produit. ⚠️ <strong>Les Ray-Ban ne sont plus dans cette carte : elles passent en V1 le 12/08</strong> (carte suivante).</p>
|
||||
<p>Pilote presse uniquement, quand le SDK sort de preview. Profil d'appel à projets, pas de ligne produit. ⚠️ <strong>Les Ray-Ban ne sont plus dans cette carte : elles sont passées en V1 le 12/08</strong>, et leur volet stats est livré depuis le 13/08 (voir « Fait récemment »).</p>
|
||||
<span class="src">roadmap.md — section XR</span>
|
||||
</article>
|
||||
|
||||
<article class="card" data-area="visitapp" data-horizon="v1">
|
||||
<div class="card-meta"><span class="tag">visitapp</span><span class="tag">lunettes</span><span class="flag f-warn">Nouveau 12/08</span></div>
|
||||
<h3>Canal Vocal des stats — l'émission côté visiteur</h3>
|
||||
<p><strong>Décidé le 12/08 : les Ray-Ban entrent en V1.</strong> Activation manuelle, instance par instance — <strong>au démarrage la seule instance concernée est MyInfoMate</strong>, celle de test, pour observer des stats vocales réelles avant de proposer quoi que ce soit. Aucune promesse externe ne dépend de cette date.</p>
|
||||
<p>⚠️ <strong>L'écran est déjà fait, c'est l'émission qui manque</strong> — donc <strong>zéro ligne dans manager-app</strong> : <code>statistics_screen.dart</code> traite déjà <code>AppType.Voice</code> (libellé <code>:189</code>, part du vocal <code>:205-210</code>, KPI conditionnel <code>:533-541</code>, takeaway <code>:480</code>). Tout le travail est dans <code>mymuseum-visitapp</code>.</p>
|
||||
<p><strong>Trois trous mesurés le 12/08.</strong> (1) <code>MyInfoMateLlmClient:40</code> envoie <code>AppType.Mobile</code> alors que son commentaire <code>:9</code> annonce Voice. (2) <code>StatisticsService</code> est construit en dur avec <code>appType: 'Mobile'</code> (<code>home_3.0.dart:715</code>), son champ étant documenté <code>// "Mobile" or "Tablet"</code>. (3) <strong>Le plus lourd : le flux lunettes n'émet aucun <code>VisitEvent</code></strong> — tous les <code>track()</code> sont dans des écrans d'interface ; <code>Services/Glasses/</code>, <code>wake_word_service</code> et <code>geo_beacon_trigger_service</code> n'en appellent aucun. Une visite vocale ne produit aujourd'hui ni session, ni section vue, ni durée.</p>
|
||||
<p><strong>Périmètre tranché : session + contenu lu à voix haute.</strong> Une session <code>Voice</code> à l'activation, un <code>sectionView</code> quand le guide lit réellement une section (QR, beacon ou question). ⛔ <strong>Pas d'événement par question</strong> : elles sont déjà dans <code>VisitorQuestion</code> et remontent dans l'onglet Guide IA — les compter ici serait le même fait dans deux écrans. Ce périmètre fait marcher les KPI existants et l'export PDF <strong>sans retouche</strong>.</p>
|
||||
<p>⛔ <strong>Le « fallback Voice → Mobile » n'existe pas</strong> — <code>guide-ia-screen-plan.md:226</code> l'affirmait et le commentaire d'<code>AiController:356</code> le répétait : les deux étaient faux et se confirmaient mutuellement. Le code fait un <code>FirstOrDefault</code> sur le canal exact puis <code>Forbid()</code> (<code>:357-361</code>) : envoyer <code>Voice</code> au chat sans <code>ApplicationInstance</code> de ce type rendrait <strong>403 à chaque question</strong>, extinction silencieuse des lunettes. ✅ <strong>Le chat reste donc en <code>Mobile</code></strong> : les lunettes tournent <em>dans</em> l'app mobile, qui a déjà chargé son canal — un canal Voice la ferait jongler entre deux, piège déjà rencontré en K2 avec <code>getConfigurations</code>.</p>
|
||||
<p>⛔ <strong>CORRECTION du 12/08, quelques heures après : les <code>VisitEvent</code> ne portent pas <code>Voice</code> non plus. Le vocal n'est pas un canal, c'est un attribut.</strong> La décision du miroir vocal (carte suivante) rend explicite qu'un visiteur passe des lunettes à l'écran <strong>dans une même session</strong>. Or <code>StatisticsService</code> génère <strong>un seul <code>sessionId</code> par lancement</strong>, et <code>AppTypeDistribution</code> compte une entrée par session en tranchant l'ambiguïté sur <strong>l'événement le plus ancien</strong> (<code>StatsController:196-203</code>) : commencer au doigt puis mettre les lunettes ⇒ session comptée <code>Mobile</code>, vocal invisible ; l'inverse ⇒ session comptée <code>Voice</code>, navigation tactile comprise. Le KPI dirait « sessions <em>démarrées</em> en vocal », pas « part du vocal ».</p>
|
||||
<p>✅ <strong>Retenu : marquer les événements consommés à la voix dans <code>VisitEvent.Metadata</code></strong> — colonne JSON <strong>déjà existante</strong>, déjà exploitée par <code>GetSummary</code> pour six agrégats : <strong>aucune migration, le gel du lot B tient</strong>. KPI juste : « part des sessions ayant utilisé le vocal ». <strong>C'est la conception déjà appliquée ailleurs</strong> — <code>VisitorQuestion</code> n'a pas de canal vocal, il a <code>IsVoice</code> <em>à côté</em> de son <code>AppType</code>. <code>AppType.Voice</code> retrouve son sens d'origine : un déploiement lunettes <strong>autonome</strong>, cas pour lequel l'enum a été créé et qui n'est pas celui-ci. ⚠️ <strong>Conséquence : « zéro ligne dans manager-app » devient faux</strong> — <code>_voiceSessions</code> lit <code>appTypeDistribution['Voice']</code> (<code>statistics_screen.dart:205-206</code>) et devra lire un nouvel agrégat. ~3 h.</p>
|
||||
<p>⚠️ Deux réserves qui survivent : la branche <code>Meta-Rayban-Test</code> <strong>n'est toujours pas mergée</strong> (question déjà ouverte avant K6, et plus pressante puisqu'on ne publie plus un POC mais une fonction V1), et <strong>ne pas vendre l'add-on avant la bascule TTS ElevenLabs → Gemini</strong>.</p>
|
||||
<span class="src">v1-plan.md lot F — canal Vocal · v2/guide-ia-screen-plan.md</span>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@ -854,9 +840,16 @@
|
||||
|
||||
<section class="done">
|
||||
<h2>Fait récemment</h2>
|
||||
<p>Cinquante-six chantiers clos entre le 5 et le 13 août 2026.</p>
|
||||
<p>Cinquante-sept chantiers clos entre le 5 et le 13 août 2026. <strong>Le lot F est clos.</strong></p>
|
||||
<div class="done-grid">
|
||||
|
||||
<div class="done-item">
|
||||
<strong>Le lot F est clos — canal vocal des stats, et L9 qui n'était pas un chantier</strong>
|
||||
<span><strong>Le vocal est un attribut, pas un canal</strong>, comme tranché le 12/08. <code>StatisticsService.track</code> porte <code>isVoice</code>, qui pose <code>"voice": true</code> dans <code>VisitEvent.Metadata</code> — <strong>colonne existante, donc aucune migration et le gel du lot B tient</strong>. Le serveur expose « sessions ayant utilisé le vocal » et <code>statistics_screen</code> lit cet agrégat au lieu d'<code>appTypeDistribution['Voice']</code>, qui ne se serait jamais rempli.</span>
|
||||
<span>⚠️ <strong>Le <code>sectionView</code> vocal part après la synthèse, pas avant</strong> : un déclenchement dont le TTS échoue n'a rien fait entendre, le compter serait faux. ⛔ Aucun événement par question posée — elles sont déjà dans <code>VisitorQuestion</code>. ⚠️ <strong>Le test InMemory ne prouve rien ici</strong>, le provider évaluant le filtre côté client : un test Postgres a été ajouté à côté, il se saute sans démon Docker.</span>
|
||||
<span>⛔ <strong>L9 était un malentendu de doc, pas du travail.</strong> La « cible Assistant / Persona » du Mode preview est exactement ce que le §5 du Guide IA a livré le 11/08. Les trois autres cibles (iframes mobile/web/kiosk, viewports, preview-token) sont hors V1. ⚠️ <strong>Mais l'aperçu polluait les stats du client</strong> : chaque essai de personnalité par le gestionnaire était journalisé comme une question de visiteur. Corrigé — et le drapeau d'hier, <code>IsAutoTriggered</code>, est renommé <code>IsVisitorQuestion</code> (défaut <code>true</code>) parce que son vrai sens couvrait déjà les deux cas. <code>dotnet test</code> 218.</span>
|
||||
</div>
|
||||
|
||||
<div class="done-item">
|
||||
<strong>Une conversation, plusieurs surfaces — miroir vocal et <code>conversationId</code></strong>
|
||||
<span>Le chat écrit, le vocal et le proactif partagent désormais <strong>une seule</strong> conversation, portée par <code>VisitAppContext.assistant</code>. Les trois <code>AssistantService</code> séparés ont disparu ; le <code>maxHistory: 6</code> du vocal s'aligne sur 10, deux surfaces qui partagent une conversation ne pouvant pas la tronquer différemment selon le point d'entrée. La concision vocale vient d'<code>isVoice</code>, qui change le prompt côté serveur.</span>
|
||||
|
||||
20
v1-plan.md
20
v1-plan.md
@ -186,10 +186,24 @@ Ne change pas : la popup de traduction (un niveau justifié, langues verticales,
|
||||
|
||||
✅ **`conversationId` est enfin envoyé, et le champ manquait dans le client généré** — c'est ce qui expliquait que personne ne l'envoyait. Ajouté à la main dans `manager_api_new`. Il est renouvelé quand la conversation est vidée : sinon la visite entière d'un même visiteur n'en formerait qu'une. **2 tests serveur** fixent le lien entre deux tours et le repli — la branche `Guid.NewGuid()` n'était couverte par rien.
|
||||
|
||||
✅ **Canal vocal des stats livré le 2026-08-13, et L9 refermé.** `dotnet test` **218** (dont un test Postgres), APK `dev` ✅, `flutter build web` ✅.
|
||||
|
||||
**Le vocal est un attribut, pas un canal** — la correction du 12/08 est appliquée telle quelle. `StatisticsService.track` porte `isVoice`, qui pose `"voice": true` dans `VisitEvent.Metadata` — **colonne existante, donc aucune migration et le gel du lot B tient**. `StatsSummaryDTO.VoiceSessions` compte les **sessions ayant utilisé le vocal**, et `statistics_screen` lit cet agrégat au lieu d'`appTypeDistribution['Voice']`, qui ne se serait jamais rempli.
|
||||
|
||||
⚠️ **Le `sectionView` vocal est émis après la synthèse, pas avant** : un déclenchement dont le TTS échoue n'a rien fait entendre, le compter serait faux. ⛔ **Aucun événement par question posée**, conformément à l'arbitrage : elles sont déjà dans `VisitorQuestion` et remontent dans l'onglet Guide IA.
|
||||
|
||||
⚠️ **Le test InMemory ne prouve rien ici** — le provider évalue le `Contains` côté client, donc une requête intraduisible passerait au vert. Un test Postgres a été ajouté à côté ; il se saute sans démon Docker, comme les 14 autres.
|
||||
|
||||
⛔ **L9 : la convergence n'était pas un chantier, c'était un malentendu de doc.** La « cible Assistant / Persona » du Mode preview (`todo-features.md:599-603`) est **exactement** ce que le §5 du Guide IA a livré le 11/08 — `_sendPreview` interroge le vrai `/api/AI/chat`. Les trois autres cibles du Mode preview (mobile, web, kiosk en iframe, sélecteur de viewport, preview-token) sont une feature bien plus large, **hors V1**. Rien à coder.<br>⚠️ **Mais l'aperçu polluait les stats du client** : chaque essai de personnalité par le gestionnaire était journalisé comme une question de visiteur. Corrigé dans la même passe — voir le renommage ci-dessous.
|
||||
|
||||
⚠️ **`IsAutoTriggered` renommé en `IsVisitorQuestion` (défaut `true`).** Le nom d'hier ne couvrait qu'un des deux cas : le vrai sens n'est pas « déclenché automatiquement » mais « ce tour n'est pas une question de visiteur », ce qui vaut aussi pour l'aperçu du gestionnaire. Renommé pendant qu'un seul commit en dépendait. Le défaut à `true` est délibéré : une app visiteur déjà publiée, qui n'envoie pas le champ, continue de journaliser — **un test le fixe**.
|
||||
|
||||
**Ce qui reste au lot F, et dans quel repo** — le backend ne bloque plus rien :
|
||||
- ~~`manager-app`~~ ✅ **livré le 2026-08-13** : bouton du Customer Portal et diviseur `aiTokensPerQuestion`. `flutter analyze lib` **sans erreur**, `flutter build web` ✅. Détail ci-dessous.
|
||||
- `mymuseum-visitapp` : déclenchement proactif (+ M3), miroir de la conversation vocale, émission des événements vocaux. C'est désormais **tout le reste du lot F**, et le plus gros.
|
||||
- Non commencé, indépendant : l'aperçu de conversation (**L9**).
|
||||
- ~~`manager-app`~~ ✅ **livré le 2026-08-13** : bouton du Customer Portal et diviseur `aiTokensPerQuestion`.
|
||||
- ~~`mymuseum-visitapp`~~ ✅ **livré le 2026-08-13** : déclenchement proactif (+ M3), miroir de la conversation vocale, émission des événements vocaux.
|
||||
- ~~L9, aperçu de conversation~~ ⛔ **sans objet** — livré par DB3 le 11/08, le reste du Mode preview est hors V1.
|
||||
|
||||
🎉 **Le lot F est clos le 2026-08-13.** Ce qui reste avant la bascule : le **lot J** (RGPD), **K6** (publier les APK), **K9** (repasse visuelle de la borne, sacrifiable), le **lot H** (tests, dont D0 et §21 sur device), **D5**, et le **lot I** (infra + bascule).
|
||||
|
||||
**Volet proactif + M3 du 2026-08-13 (`mymuseum-visitapp`) — ce que le code a corrigé de l'énoncé :**
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user