11 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #291 | 7 |
|
1788940935288 |
Carnet #291
Signalement utilisateur
Le redémarrage agent est fonctionnel et l'affichage initial après redémarrage est correct. Régression restante: après un changement de projet puis retour sur le projet courant, la conversation s'efface si un redémarrage de l'agent a eu lieu.
Attendu produit
La conversation doit rester visible et rechargée comme si aucun redémarrage agent n'avait eu lieu.
Reproduction cible
- Projet A ouvert, conversation agent visible.
- Redémarrer l'agent.
- Vérifier que la conversation reste visible.
- Basculer vers un autre projet.
- Revenir au projet A.
- Vérifier que la conversation est toujours présente.
Cadrage UX
- Le transcript persisté est source de vérité après changement de projet, redémarrage app ou réhydratation de surface.
- Le live buffer ne complète que la session active; un buffer vide ne doit jamais écraser un transcript persisté non vide.
- Pendant la réhydratation, ne pas afficher prématurément
Aucun message; garder l'ancien contenu si disponible ou afficher un chargement transitoire. - En erreur réelle de lecture: afficher
Impossible de recharger la conversation. Réessayersans remplacer un contenu ancien disponible.
Cadrage architecture
- Frontière probable: frontend project switching / reconnect et reconstruction du viewer, pas persistance backend en première intention.
- Invariant:
conversationIdstable à travers restart agent, changement de projet, reconnect/refresh; contenu lu viaGateways.conversation.readPage/read_conversation_page. - Le live-state peut porter un pointeur mais ne doit pas devenir source de vérité du transcript.
- Inspecter notamment
ProjectsView.tsx,WebWorkspace.tsx,ConversationViewer.tsx,useConversationThread.ts, adapters conversation, source deconversationIddans ports/workstate/layout. - Backend à vérifier seulement si perte de projection
conversationIdaprès restart/open_project.
Critères QA
- Scénario restart agent + changement projet + retour projet: messages pré et post restart visibles, ordre conservé, sans duplication.
- Test automatisé frontend attendu:
conversationIdstable, switch projet puis retour,ConversationGateway.readPagerelancé avec le même id. - Test backend de projection workstate seulement si l'inspection révèle une perte côté backend.
Orchestration
- Ticket créé par Main le 2026-09-09.
- UX et Architect consultés.
- Prochaine étape: Git pour branche locale, puis DevFrontend en première intention.
Livraison DevFrontend — 2026-09-09
Diagnostic
ProjectsViewconservait bien{ projectId, conversationId }, mais rendait le viewer du projet source même lorsqu'un autre projet devenait actif. Le composant ne se démontait donc pas pendant l'aller-retour etuseConversationThreadne relançait pasConversationGateway.readPageau retour, puisque ses identifiants n'avaient jamais changé.WebWorkspaceavait l'écart symétrique: il supprimait entièrement le pointeur du viewer à chaque changement de projet, empêchant toute réhydratation au retour.- Les adapters Tauri et HTTP transmettent déjà correctement le même
projectId/conversationIdàread_conversation_page; aucune preuve de perte backend du pointeur n'a été trouvée.
Correctif
- Le viewer conservé n'est rendu que si son
projectIdcorrespond au projet actif. Le projet intermédiaire affiche sa propre surface; le retour au projet source remonte le viewer et relance la lecture persistée avec le mêmeconversationId. - Même règle appliquée au shell web; son pointeur n'est plus effacé au switch.
useConversationThreadne vide plus préventivement un buffer existant avant la relecture. Le premier montage affiche toujoursChargement du fil…; un contenu déjà disponible reste visible pendant une relecture ou en cas d'échec.- L'erreur de lecture affiche
Impossible de recharger la conversation.et l'actionRéessayer, sans retirer les tours déjà visibles.
Fichiers modifiés
frontend/src/features/projects/ProjectsView.tsxfrontend/src/features/web/WebWorkspace.tsxfrontend/src/features/conversations/useConversationThread.tsfrontend/src/features/conversations/ConversationViewer.tsxfrontend/src/features/projects/ProjectsView.ls7.test.tsxfrontend/src/features/conversations/ConversationViewer.test.tsx
Preuves exécutées
npm --prefix frontend test -- --run src/features/projects/ProjectsView.ls7.test.tsx -t "rehydrates the same conversation"— OK, 1 test passé (8 ignorés par le filtre). Le test simule le restart, A→B→A, vérifie le contenu et deux appelsreadPagestrictement identiques sur{ projectId, conversationId }.npm --prefix frontend test -- --run src/features/conversations/ConversationViewer.test.tsx src/features/conversations/useConversationThread.test.tsx— OK, 2 fichiers / 19 tests passés.npm --prefix frontend run build— OK (tsc --noEmitpuis build Vite, 515 modules).git diff --check— OK.
Gaps observés hors lot
- Le fichier complet
ProjectsView.ls7.test.tsxconserve 4 scénarios historiques KO car leur helper ne parvient plus à ouvrir le panneau Work et ne trouve pasopen conversation …; le nouveau scénario #291 passe isolément et ouvre le viewer via l'événement de complétion persistant. WebDesktopWorkspace.test.tsxa 1 test historique KO sur un libellé attendu en anglais (Project context) alors que l'UI expose désormaisContexte projet; 2 autres tests passent. Aucun de ces échecs ne touche le chemin #291.- Aucun gap backend détecté.
Validation QA indépendante — 2026-09-09
Verdict
VERT pour le périmètre #291 sur fix/291-keep-conversation-after-restart-project-roundtrip.
Inspection
- Diff vérifié sur
ProjectsView.tsx: le viewer conserve son pointeur global, mais n'est rendu que lorsqueviewerConversation.projectId === active.id; le switch vers un autre projet démonte donc la surface et le retour remonte le viewer avec la même clé{projectId, conversationId}. - Diff vérifié sur
WebWorkspace.tsx: même règle côté web, sans remise ànulldu pointeur au changement de projet. - Diff vérifié sur
useConversationThread.ts: suppression dusetBuffer([])au changement/rechargement; le buffer existant n'est plus vidé pendant une relecture. - Diff vérifié sur
ConversationViewer.tsx: l'erreur de lecture expose un état de retry sans remplacer explicitement un contenu déjà présent. - Test #291 ajouté dans
ProjectsView.ls7.test.tsx: simule restart agent, switch alpha -> beta -> alpha, vérifie le contenu et deux appelsreadPageidentiques sur{ projectId, conversationId }.
Commandes exécutées
git status --short --branch
## fix/291-keep-conversation-after-restart-project-roundtrip
M .ideai/tickets/290/carnet.md
M .ideai/tickets/290/issue.md
M .ideai/tickets/counter.json
M .ideai/tickets/index.json
M frontend/src/features/conversations/ConversationViewer.test.tsx
M frontend/src/features/conversations/ConversationViewer.tsx
M frontend/src/features/conversations/useConversationThread.ts
M frontend/src/features/projects/ProjectsView.ls7.test.tsx
M frontend/src/features/projects/ProjectsView.tsx
M frontend/src/features/web/WebWorkspace.tsx
?? .ideai/tickets/291/
?? scripts/
npm --prefix frontend test -- --run src/features/projects/ProjectsView.ls7.test.tsx -t "rehydrates the same conversation"
Test Files 1 passed (1)
Tests 1 passed | 8 skipped (9)
Duration 2.38s
npm --prefix frontend test -- --run src/features/conversations/ConversationViewer.test.tsx src/features/conversations/useConversationThread.test.tsx
Test Files 2 passed (2)
Tests 19 passed (19)
Duration 1.34s
npm --prefix frontend run build
> idea-frontend@0.3.0 build
> tsc --noEmit && vite build
✓ 515 modules transformed.
✓ built in 2.60s
git diff --check
OK (aucune sortie)
Test additionnel
npm --prefix frontend test -- --run src/features/projects/ProjectsView.ls7.test.tsx
Test Files 1 failed (1)
Tests 3 failed | 6 passed (9)
Tests rouges observés dans ce fichier complet:
opens the viewer on a conversation click and returns to the grid on backkeeps the viewer open when the active layout changesdoes not close an open viewer when a background-task toast has no conversation
Ces trois échecs cherchent encore open conversation ... via l'ancien helper/panneau Work et correspondent aux rouges historiques déjà mentionnés hors lot. Le nouveau scénario #291 rehydrates the same conversation after an agent restart and a project roundtrip passe dans ce run complet.
Risques résiduels
- Validation effectuée par tests frontend et build local, pas par AppImage/runtime desktop réel.
- Le worktree contient des modifications non liées à #291 (
.ideai/tickets/290/*, index/counter tickets,scripts/) que QA n'a pas modifiées ni qualifiées.
Git — 2026-09-09
- Branche:
fix/291-keep-conversation-after-restart-project-roundtripcréée depuisdevelop. - Commit fix:
2c72205(6 fichiers frontend uniquement). - QA reconfirmée par Git avant commit: ConversationViewer + useConversationThread 19/19, scénario #291
rehydrates the same conversationisolé vert,git diff --checkOK. - Store de tickets synchronisé dans un
chore(tickets)séparé (inclut carnet #290 v12 sections Git + build AppImage du merge162de27). - Merge local no-ff vers
develop, aucun push. - Restants: rebuild AppImage + validation live du scénario exact (restart agent puis aller-retour projet).
scripts/non suivi maintenu hors périmètre.
Rebuild AppImage — 2026-09-09
Commandes exécutées
npm --prefix frontend run build
Résultat: OK (tsc --noEmit && vite build, 515 modules). Avertissement Vite habituel sur chunk > 500 kB.
cd crates/app-tauri
mkdir -p /tmp/idea-cargo-home
CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage
Résultat: OK. Le beforeBuildCommand a reconstruit frontend/dist et frontend/dist-web, puis Rust release a compilé et le bundle AppImage a été produit.
Artefact
- Chemin:
target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage - Taille: 114M
- SHA-256:
8629ffef8939a08ff2b1008be515e778004cc34413a988cbf37ad71c2e3083dc
Reste manuel
Pour rendre le correctif actif dans l'application installée, remplacer l'AppImage utilisée (/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage) par l'artefact ci-dessus puis relancer IdeA. Cette étape n'a pas été automatisée car elle tue l'orchestrateur courant.