--- issueRef: "#239" version: 7 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} updatedAt: 1787409561579 --- 2026-08-22 - Signalement utilisateur via capture sur un autre projet (GameTime): après un long message utilisateur dans la conversation avec Main, la surface affiche `Échec — La réponse du modèle n'a pas pu être finalisée.`. - Cadrage UX: distinguer échec transitoire, réponse tronquée, fin non reçue et échec sans contenu; ne jamais masquer le contenu partiel; proposer des actions de reprise adaptées. - Cadrage Architecture: hypothèse principale = stream structuré fermé sans `Final` reconnu ou correctement propagé; instrumentation recommandée sur start/event-stream/close/error-mapping/transcript. - Git: branche locale `fix/239-modele-reponse-non-finalisee` créée depuis `develop` @ `ce03471`. - DevBackend: cause racine confirmée côté runtime Claude structuré. `ClaudeSdkSession` pouvait produire des `TextDelta` puis fermer sans `ReplyEvent::Final` si la ligne `result` Claude manquait ou n’était pas reconnue; la UI interprétait alors le stream comme non finalisé malgré du contenu exploitable. Fix: fallback qui synthétise un `ReplyEvent::Final` à partir des `TextDelta` accumulés, sans masquer un `Final`, `Error` ou `RateLimited` réel. - DevFrontend: `CustomAgentChatView` préservait déjà le contenu partiel; la surface à corriger était `useTicketAssistant`, qui remplaçait le contenu streamé par le message d’échec sur un chunk terminal `error`. Fix frontend: conservation du contenu partiel + qualification du cas (`Réponse partielle — fin non reçue`, `Réponse tronquée`, `échec transitoire possible`, `Échec sans contenu`). - Première QA 2026-08-22: frontend vert, nouveaux tests ciblés backend verts, mais un test backend existant échoue encore: `session::tests::stream_without_final_is_silently_ok_at_adapter_level` dans `crates/infrastructure/src/session/mod.rs:1540`. - Symptôme QA exact: l’ancien test attend encore `0` Final synthétique (`assertion left == right failed: comportement actuel: aucun Final fabriqué`, left=1 right=0). - Retour DevBackend suite QA: alignement du test contradictoire existant sur le nouveau contrat #239. Fichiers backend désormais modifiés: `crates/infrastructure/src/session/claude.rs` et `crates/infrastructure/src/session/mod.rs`. Re-tests backend ciblés verts. - Étape courante: revalidation QA indépendante complète.