Miroir vocal livré — plan, STATUS et kanban
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>
This commit is contained in:
parent
a2d4eb2944
commit
c0308a95c0
26
kanban.html
26
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-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 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">6</span><span class="k">À tester</span></div>
|
||||||
<div class="stat"><span class="n">24</span><span class="k">Planifié</span></div>
|
<div class="stat"><span class="n">23</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-gate">8</span><span class="k">Bascule prod</span></div>
|
||||||
<div class="stat"><span class="n n-good">55</span><span class="k">Fait récemment</span></div>
|
<div class="stat"><span class="n n-good">56</span><span class="k">Fait récemment</span></div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div class="filters" role="group" aria-label="Filtrer par domaine">
|
<div class="filters" role="group" aria-label="Filtrer par domaine">
|
||||||
@ -584,7 +584,7 @@
|
|||||||
|
|
||||||
<!-- PLANIFIÉ -->
|
<!-- PLANIFIÉ -->
|
||||||
<section class="col" style="--stripe: var(--ink-3)">
|
<section class="col" style="--stripe: var(--ink-3)">
|
||||||
<div class="col-head"><h2>Planifié</h2><span class="count">24</span></div>
|
<div class="col-head"><h2>Planifié</h2><span class="count">23</span></div>
|
||||||
|
|
||||||
|
|
||||||
<div class="stack">
|
<div class="stack">
|
||||||
@ -656,16 +656,6 @@
|
|||||||
<span class="src">v1-plan.md — lot J · cgu-myinfomate.md §8 · mention-information-visiteurs.md</span>
|
<span class="src">v1-plan.md — lot J · cgu-myinfomate.md §8 · mention-information-visiteurs.md</span>
|
||||||
</article>
|
</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>Miroir de la conversation vocale dans le chat</h3>
|
|
||||||
<p><strong>Tranché le 12/08</strong> : ouvrir l'assistant pendant que les lunettes tournent doit montrer <strong>la même conversation</strong>, transcrite au fil de l'eau. Une conversation, deux surfaces.</p>
|
|
||||||
<p>⚠️ <strong>Le coût n'est pas l'affichage, c'est l'unification des historiques.</strong> <code>MyInfoMateLlmClient</code> construit <strong>son propre</strong> <code>AssistantService</code> (<code>maxHistory: 6</code>), distinct de celui du chat écrit : poser une question aux lunettes puis ouvrir le chat donne aujourd'hui un interlocuteur qui ne sait rien de ce qu'on vient de demander. La transcription, elle, est déjà là — <code>VoiceOrchestrator</code> expose <code>lastTranscription</code> et <code>lastTtsText</code>, personne ne les affiche.</p>
|
|
||||||
<p>✅ <strong>Bénéfice de bord</strong> : <code>VisitorQuestion.ConversationId</code> est un GUID de session, « seul lien entre deux tours ». Deux historiques = deux conversations en base pour un visiteur qui a juste changé de surface. <strong>Unifier répare aussi les agrégats du Guide IA</strong>, donc ce que le job de thèmes du lot J regroupera. ⛔ Écarté : l'affichage passif dans <code>VoiceModeSheet</code> (2-3 h) — ça montrait que ça marche sans réparer la coupure. ~1 à 2 jours.</p>
|
|
||||||
<p>⚠️ <strong>Ne rien redessiner, l'UI existe.</strong> <code>GlassesStatusWidget</code> est monté en haut à droite de l'accueil (<code>home_3.0.dart:465</code>) : état par couleur, pastille de mode actif, tap → <code>VoiceModeSheet</code> (connexion, choix de mode, désactivation). <code>GlassesDebugPanel</code> existe et <strong>se garde</strong> — c'est l'outil de test. Seul écart avec « tout le temps présente », et il est volontaire : l'icône se cache si <code>applicationInstanceDTO?.isAssistant != true</code> (<code>GlassesStatusWidget.dart:32</code>) — invisible chez MDLF et le Fort, visible sur l'instance MyInfoMate. <strong>À savoir avant de tester chez un client et de croire à un bug.</strong></p>
|
|
||||||
<span class="src">v1-plan.md lot F — miroir vocal</span>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<article class="card" data-area="manager" data-horizon="v1">
|
<article class="card" data-area="manager" data-horizon="v1">
|
||||||
<div class="card-meta"><span class="tag">manager-app</span><span class="flag f-warn">Jamais ouvert</span></div>
|
<div class="card-meta"><span class="tag">manager-app</span><span class="flag f-warn">Jamais ouvert</span></div>
|
||||||
<h3>Écrans du lot design — vérification à l'œil</h3>
|
<h3>Écrans du lot design — vérification à l'œil</h3>
|
||||||
@ -864,9 +854,17 @@
|
|||||||
|
|
||||||
<section class="done">
|
<section class="done">
|
||||||
<h2>Fait récemment</h2>
|
<h2>Fait récemment</h2>
|
||||||
<p>Cinquante-cinq chantiers clos entre le 5 et le 13 août 2026.</p>
|
<p>Cinquante-six chantiers clos entre le 5 et le 13 août 2026.</p>
|
||||||
<div class="done-grid">
|
<div class="done-grid">
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<span>⚠️ <strong>Le vrai obstacle n'était pas l'affichage mais la forme du chat.</strong> <code>AssistantChatSheet</code> gardait ses messages en <code>List<Widget></code> — des bulles déjà construites. On ne rejoue pas une conversation à partir de widgets, et un tour vocal survenu pendant que la feuille était fermée n'aurait jamais pu y entrer. Le service porte maintenant les tours <strong>en données</strong> et notifie ; la feuille rend depuis eux et se met à jour en direct.</span>
|
||||||
|
<span>⚠️ <strong>Deux listes, délibérément</strong> : celle envoyée au modèle et celle affichée ne coïncident pas. Un message d'erreur se montre sans repartir au guide — il n'a pas à s'excuser d'une panne au tour suivant ; le prompt d'un déclenchement proactif part au guide <strong>sans jamais s'afficher</strong>, seule sa réponse apparaît, marquée « À voix haute ». Sans ce marquage, le visiteur trouverait dans son chat des messages qu'il n'a jamais tapés.</span>
|
||||||
|
<span>✅ <strong><code>conversationId</code> est enfin envoyé — et le champ manquait dans le client généré</strong>, ce qui explique que personne ne l'envoyait. Ajouté à la main. Il est renouvelé quand la conversation est vidée, sinon la visite entière d'un visiteur n'en formerait qu'une. 2 tests serveur fixent le lien entre deux tours et le repli <code>Guid.NewGuid()</code>, que rien ne couvrait. <code>dotnet test</code> 215, APK <code>dev</code> ✅, <code>flutter build web</code> ✅.</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="done-item">
|
<div class="done-item">
|
||||||
<strong>Les prompts du mode proactif ne polluent plus « Ce que demandent vos visiteurs »</strong>
|
<strong>Les prompts du mode proactif ne polluent plus « Ce que demandent vos visiteurs »</strong>
|
||||||
<span>Le dernier bloquant du proactif. <code>RecordVisitorQuestion</code> écrivait <code>Question = request.Message</code> : chaque passage devant une œuvre aurait ajouté <strong>une fausse question de visiteur</strong> — une consigne que le système s'écrit à lui-même — dans l'écran fait pour montrer ce que les <strong>humains</strong> demandent. Et <code>HasAnswer</code> se déduisant des sources, un prompt d'accueil sans citation aurait <strong>gonflé le bloc ambre des questions sans réponse</strong>. Même famille que <code>WeatherSyncService</code> noyant le journal d'audit.</span>
|
<span>Le dernier bloquant du proactif. <code>RecordVisitorQuestion</code> écrivait <code>Question = request.Message</code> : chaque passage devant une œuvre aurait ajouté <strong>une fausse question de visiteur</strong> — une consigne que le système s'écrit à lui-même — dans l'écran fait pour montrer ce que les <strong>humains</strong> demandent. Et <code>HasAnswer</code> se déduisant des sources, un prompt d'accueil sans citation aurait <strong>gonflé le bloc ambre des questions sans réponse</strong>. Même famille que <code>WeatherSyncService</code> noyant le journal d'audit.</span>
|
||||||
|
|||||||
10
v1-plan.md
10
v1-plan.md
@ -176,6 +176,16 @@ Ne change pas : la popup de traduction (un niveau justifié, langues verticales,
|
|||||||
|
|
||||||
✅ **Volet `manager-service` terminé le 2026-08-13.** Customer Portal livré, ratio jetons → questions calé sur du réel ; le rate limiting, l'endpoint `ApplicationInstance` et les quotas seed **étaient déjà faits** et n'attendaient qu'une vérification (détail dans les lignes concernées). `dotnet build` vert, `dotnet test` **211 au total : 197 passés, 14 sautés** (Testcontainers, pas de démon Docker), 0 échec.
|
✅ **Volet `manager-service` terminé le 2026-08-13.** Customer Portal livré, ratio jetons → questions calé sur du réel ; le rate limiting, l'endpoint `ApplicationInstance` et les quotas seed **étaient déjà faits** et n'attendaient qu'une vérification (détail dans les lignes concernées). `dotnet build` vert, `dotnet test` **211 au total : 197 passés, 14 sautés** (Testcontainers, pas de démon Docker), 0 échec.
|
||||||
|
|
||||||
|
✅ **Miroir de la conversation vocale livré le 2026-08-13.** `flutter analyze lib` sans erreur, APK `dev` ✅, `dotnet test` **215**, `flutter build web` ✅.
|
||||||
|
|
||||||
|
**Une seule conversation, portée par `VisitAppContext.assistant`.** Le chat écrit, le vocal et le proactif partagent l'instance ; les trois `AssistantService` séparés ont disparu. Le `maxHistory: 6` du vocal s'aligne sur 10 : deux surfaces qui partagent une conversation ne peuvent pas la tronquer différemment selon le point d'entrée, et la concision vocale vient d'`isVoice`, qui change le prompt côté serveur.
|
||||||
|
|
||||||
|
⚠️ **Le vrai obstacle n'était pas l'affichage mais la forme du chat** : `AssistantChatSheet` gardait ses messages en `List<Widget>` — des bulles déjà construites. On ne rejoue pas une conversation à partir de widgets, et un tour vocal survenu pendant que la feuille était fermée n'aurait jamais pu y entrer. Le service porte désormais les tours **en données** (`AssistantTurn`) et notifie ; la feuille rend depuis eux et se met à jour en direct.
|
||||||
|
|
||||||
|
⚠️ **Deux listes, et c'est délibéré** : `_history` (envoyée au modèle) et `_turns` (affichée) ne coïncident pas. Un message d'erreur se montre sans repartir au guide — il n'a pas à s'excuser d'une panne au tour suivant ; et le prompt d'un déclenchement proactif part au guide **sans jamais s'afficher**, seule sa réponse apparaît, marquée « À voix haute ». Sans ce marquage, un visiteur ouvrant le chat trouverait des messages qu'il n'a jamais tapés.
|
||||||
|
|
||||||
|
✅ **`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.
|
||||||
|
|
||||||
**Ce qui reste au lot F, et dans quel repo** — le backend ne bloque plus rien :
|
**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.
|
- ~~`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.
|
- `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.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user