From ee35c15958b53609438404eabd34c926cc41921e Mon Sep 17 00:00:00 2001 From: Blomios Date: Wed, 5 Aug 2026 23:40:03 +0200 Subject: [PATCH] chore(tickets): journalise le correctif routing chat vs PTY #149 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Met à jour le carnet avec la preuve runtime returned cellKind=pty; expected chat - Documente les hypothèses invalidées et la nouvelle cible de correction - Met à jour issue.md avec le titre et le diagnostic consolidés - Incrémente le compteur et ajoute les tickets 150-158 à l'index Co-Authored-By: Claude Opus 4.8 --- .ideai/tickets/149/carnet.md | 246 ++++++++++++++++------------------- .ideai/tickets/149/issue.md | 26 ++-- .ideai/tickets/counter.json | 2 +- .ideai/tickets/index.json | 133 ++++++++++++++++++- 4 files changed, 259 insertions(+), 148 deletions(-) diff --git a/.ideai/tickets/149/carnet.md b/.ideai/tickets/149/carnet.md index 5136ea1..9a9e4ee 100644 --- a/.ideai/tickets/149/carnet.md +++ b/.ideai/tickets/149/carnet.md @@ -1,151 +1,125 @@ --- issueRef: "#149" -version: 15 -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedAt: 1785937428431 +version: 25 +updatedBy: {"kind":"user"} +updatedAt: 1785964173499 --- # Historique des tentatives -## 2026-08-05 — Reouverture utilisateur -- Symptome utilisateur revalide: la CLI custom s'ouvre environ une demi-seconde puis la cellule retombe directement vers Plain/TUI. -- Le ticket etait encore en `QA` alors que le comportement attendu n'est pas corrige en pratique. -- Constat de pilotage: le carnet etait vide, donc les tentatives precedentes n'etaient pas tracees ici. -- Action Main: reouverture du ticket et relance d'un cycle complet Architect -> Git -> DevFrontend -> QA. +## 2026-08-05 — Implementation frontend bornee `cellKind` + validation QA verte +- **Pourquoi cette tentative change d'hypothese**: on ne repart pas sur `LayoutGrid` ni sur un nouveau patch `NOT_FOUND`. La tentative cible explicitement le desalignement possible entre la reponse reelle de `launch_agent` et ce que le frontend croit lancer en session structuree. +- **Manip/code reel cote DevFrontend**: + 1. `frontend/src/adapters/agent.ts` relaie maintenant `cellKind` dans `LaunchAgentResponse` et refuse explicitement toute reponse `cellKind !== "chat"` dans `launchAgentChat()`. + 2. En cas de routage non-chat, le frontend loggue `[ticket149] launchAgentChat:routed-to-non-chat` avec requete/reponse completes et leve `STRUCTURED_ROUTED_TO_PTY` **avant** de publier un faux `sessionId` structure. + 3. `frontend/src/ports/index.ts` borne `AgentChatHandle` avec `cellKind: "chat"`. + 4. `frontend/src/adapters/mock/index.ts` est aligne avec `cellKind: "chat"`. + 5. Tests ajoutes/etendus: + - `frontend/src/adapters/agent.test.ts`: cas `cellKind: "chat"` accepte + cas `cellKind: "pty"` refuse. + - `frontend/src/features/agents/CustomAgentChatView.test.tsx`: non-regression garantissant qu'un lancement route vers PTY ne publie pas de `sessionId` et n'appelle pas `reattachAgentChat`. +- **Commandes executees par DevFrontend et resultat exact**: + 1. `cd frontend && npx vitest run src/adapters/agent.test.ts src/features/agents/CustomAgentChatView.test.tsx` -> succes ; `2 passed`, `23 passed`. + 2. `cd frontend && npx vitest run` -> succes ; `116 passed`, `1102 passed`. + 3. `cd frontend && npm run build` -> succes ; `tsc --noEmit && vite build` OK. + 4. tentative de commit locale -> echec sandbox: `fatal: Unable to create '/home/anthony/Documents/Projects/IdeA/.git/index.lock': Read-only file system` ; aucun commit cree dans ce tour. +- **Validation QA reelle sur commande**: + 1. `cd frontend && npx vitest run src/adapters/agent.test.ts src/features/agents/CustomAgentChatView.test.tsx` -> succes ; `Test Files 2 passed`, `Tests 23 passed`. + 2. `cd frontend && npm test` -> succes ; `Test Files 116 passed`, `Tests 1102 passed`. +- **Verdict QA**: lot frontend **vert** sur la branche `feature/ticket149-customchat-session-instrumentation`. +- **Resultat exact de cette tentative**: + - le frontend ne peut plus accepter silencieusement une reponse `launch_agent` routee en PTY comme si c'etait une vraie session chat structuree ; + - si le runtime route en `pty`, l'erreur devient explicite et exploitable, sans publication de faux `sessionId` ni boucle de `reattach` impossible. +- **Risque residuel maintenu explicitement**: + - ce verdict reste un verdict frontend/tests ; il manque encore la preuve runtime Tauri/AppImage du comportement reel sur un clic utilisateur, en particulier pour confirmer si le backend renvoie effectivement `cellKind: "pty"` dans le cas qui t'affecte. +- **Etape suivante**: + - faire retester la CLI custom sur le runtime reel contenant ce diff ; selon le message exact observe, trancher entre: + 1. `STRUCTURED_ROUTED_TO_PTY` -> anomalie de routage/runtime a creuser ; + 2. aucune erreur mais retombee -> bug frontend post-DTO restant ; + 3. autre erreur -> nouveau symptome a classifier avec les logs `[ticket149]`. -## Piste precedemment documentee dans la description -- Hypothese precedente: fallback premature dans `frontend/src/features/layout/LayoutGrid.tsx` pendant le chargement asynchrone initial du catalogue agent/profil, ecrasant `cellMode="custom"` restaure depuis le storage. -- Cette piste n'a pas suffi a eliminer le symptome utilisateur, donc elle doit etre revalidee ou completee avant nouvelle correction. +## 2026-08-05 — Reprise Main: recadrage borne pour casser la boucle +- **Retour utilisateur de cette reprise**: la CLI custom ne se relance toujours pas, et le probleme est confirme comme etant **anterieur** a la tentative de fix sur `not found: structured session ...`. +- **Commandes / manipulations reelles executees**: + 1. `git -C /home/anthony/Documents/Projects/IdeA status --short --branch` -> succes ; branche `feature/ticket149-customchat-session-instrumentation`, changements uniquement `.ideai/*` + changement non lie `.ideai/idea-android-plugin.json`. + 2. `git -C /home/anthony/Documents/Projects/IdeA log --oneline --decorate -n 15` -> succes ; HEAD `7071c53b`, avec historique des fixes `ce9ba0dc` et des commits d'instrumentation/journalisation. + 3. Delegation `Architect` -> succes ; recadrage: ne plus traiter `LayoutGrid` ni le simple `NOT_FOUND` comme racine sans preuve runtime nouvelle. + 4. Delegation `DevFrontend` -> succes ; nouvelle piste concrete: l'adapter frontend ignore `cellKind` dans la reponse de `launch_agent`, alors que le backend peut router effectivement en `pty`. + 5. Delegation `DevBackend` -> succes ; confirmation que `reattach_agent_chat` n'est pas une cause racine et qu'un `NOT_FOUND` est coherent si aucune session structuree stable n'a existe. + 6. Delegation `Git` -> l'agent n'a pas rendu de reponse exploitable ; la decision court terme reste celle deja consignée: conserver la branche actuelle et interdire tout merge direct vers `develop`. +- **Decision de pilotage issue de cette reprise**: + - Le message `not found: structured session ...` est desormais a classer comme **symptome secondaire**. + - La prochaine preuve utile n'est pas un nouveau patch speculatif, mais la **reponse brute** de `launch_agent` au moment du clic CLI custom: `sessionId`, `cellKind`, `assignedConversationId`, `engineSessionId`. +- **Nouvelle hypothese de travail prioritaire**: + - Si `launch_agent` repond `cellKind: "pty"`, le frontend croit a tort avoir ouvert une session structuree et entre ensuite dans une boucle de reattach impossible. + - Si aucun `launch_agent` n'est appele, le bug est frontend **pre-launch**. + - Si `cellKind: "chat"` revient bien et que la vue retombe quand meme, le bug est frontend **post-DTO**. +- **Interdictions explicites pour eviter de reboucler**: + - ne pas refaire une nouvelle variation de `shouldFallbackCustomCliMode` / `LayoutGrid.tsx` ; + - ne pas ajouter encore du handling `NOT_FOUND` dans `CustomAgentChatView.tsx` ; + - ne pas reconsiderer l'echo `sessionId` comme cause racine ; + - ne pas pointer `reattach_agent_chat` tant qu'on n'a pas prouve qu'une vraie session `chat` a existe juste avant. +- **Etape suivante imposee**: + - demander a `DevFrontend` un patch borne d'instrumentation/guard sur `LaunchAgentResponse.cellKind` pour distinguer explicitement `chat` vs `pty` au moment du lancement custom, puis faire valider ce comportement par `QA` sur un repro reel. -## 2026-08-05 — Recadrage Architecture (avant nouvelle implementation) +## 2026-08-05 — Décision Git court terme -### 1) Decouverte critique : ecart de validation binaire — a verifier EN PREMIER -- L'AppImage installee (`~/Documents/IdeA_0.3.0_amd64.AppImage`) a ete buildee le **2026-08-03 09:39**. -- Les 3 commits de correctif frontend sur ce ticket sont tous **posterieurs** : - - `51bda204` "preserve custom CLI preference during catalog load" - - `61055779` "retarde le fallback custom→TUI tant que le catalogue agents/profiles est stale" (2026-08-05 ~14:2x) - - `e9e4623e` "stabilise le mode CLI custom contre le refetch stale agents/profiles" (2026-08-05 14:24:55) - - merge `66b9c34b` (2026-08-05 14:25:03) -- Le ticket a ete reouvert a 14:31:10, soit **6 minutes apres le merge** — le retest utilisateur qui a motive la reouverture a tres probablement ete fait contre le binaire du 03/08, qui **ne contient aucun des 3 correctifs**. -- Rappel memoire projet (`mcp-bridge-and-delegation-runtime-notes`): piege recurrent dans ce projet — un correctif commite aux sources n'est actif dans l'app qu'apres rebuild + reinstall de l'AppImage + relance d'IdeA. Ne jamais interpreter un retest utilisateur comme invalidant une hypothese de fix sans confirmer que le binaire teste contient bien ce fix. -- **Action requise avant tout nouveau code** : rebuild AppImage depuis `develop` (contient deja les 3 correctifs), remplacer le binaire installe, relancer IdeA, refaire le repro utilisateur. Si le symptome disparait, le ticket se cloture sans ecrire une ligne de code supplementaire. +### État Git actuel +- **Branche active** : `feature/ticket149-customchat-session-instrumentation` +- **HEAD courant** : `7071c53b` (fix frontend NOT_FOUND) +- **Worktree** : modifications uniquement `.ideai/*` (métadonnées), aucun code source -### 2) Perimetre confirme si le symptome persiste apres rebuild -- Le bug reste **frontend-pur** dans son mecanisme d'affichage : le point de bascule visuelle custom→TUI est entierement local a `LeafView` dans `frontend/src/features/layout/LayoutGrid.tsx` (ligne ~1291) : - `agentId && cellMode === "custom" && effectiveCustomCliAvailable && customCliAgent && customCliProfile` — si une seule de ces conditions devient fausse, le rendu bascule silencieusement sur `TerminalView` (Plain/TUI) sans jamais toucher `cellMode` lui-meme dans les cas ou `customCliAvailable` retombe a faux transitoirement. -- Verification cote backend : `reattach_agent_chat` (`crates/app-tauri/src/commands.rs:2659-2687`) est concu pour etre **idempotent en cas de reattach concurrent/duplique** ("generation supersede, no double emission" — commentaire du code). Cette piste backend (un kill de session cote serveur sur double-attach) est donc **ecartee** ; aucune preuve de contrat backend fautif a ce jour. +### Décision Git EXPLOITABLE +1. **Branche à conserver** : `feature/ticket149-customchat-session-instrumentation` (contient `ce9ba0dc` et `7071c53b` qui ne sont PAS dans `develop`) +2. **Statut worktree** : RISQUE MINIMAL - modifications uniquement `.ideai/*`, pas de conflit prévisible +3. **Politique commit/merge** : INTERDICTION de merge direct vers `develop`. STRATÉGIE : cherry-pick sélectif des fixes fonctionnels (`ce9ba0dc` et/ou `7071c53b`) seulement quand validé, jamais les commits d'instrumentation +4. **Règle anti-boucle** : NE PAS retoucher LayoutGrid.tsx fallback pour une 4e fois sans trace runtime nouvelle. 3 tentatives sans effet valide, et TOUJOURS vérifier que le binaire testé contient bien les commits source (date AppImage vs date commit) -### 3) Nouvelle piste non explorees par les 3 correctifs precedents -- Les 3 correctifs precedents ont **tous** patché la garde `shouldFallbackCustomCliMode` / l'effet de fallback dans `LayoutGrid.tsx`. Aucun n'a touche `frontend/src/features/agents/CustomAgentChatView.tsx`. -- Piste a instrumenter si le symptome persiste apres rebuild : l'effet `openOrAttach` de `CustomAgentChatView.tsx` (lignes ~221-266) depend de la prop `sessionId`. Or ce meme effet, via `recoverStructuredSession`, appelle `onSessionIdRef.current(launched.sessionId)` (ligne ~184) **avant** d'avoir fini son propre `reattachStructuredSession` — ce callback remonte par `vm.setSession` (LayoutGrid) et fait changer la prop `sessionId` elle-meme, ce qui redeclenche l'effet une seconde fois en parallele (double appel `reattachStructuredSession` sur la meme session). Le backend tolere ce doublon (cf §2) donc ce n'est probablement pas fatal en soi, mais c'est un **feedback loop d'effet non intentionnel**, jamais audite, et un candidat concret pour la 4e iteration si le probleme n'est pas qu'un binaire perime. +## 2026-08-05 — NOUVEAU RECADRAGE APRES RETOUR UTILISATEUR CRITIQUE +- **Retour utilisateur**: "je ne peux de nouveau plus lancer la cli custom" ET "on tourne en rond, c'etait deja le souci avant qu'on essaie de regler le message not found: structured session ..." +- **Consequence decisive**: le message `NOT_FOUND` N'EST PAS le bug source. Le bug original est revenu: la CLI custom s'ouvre 1/2 seconde puis retombe vers Plain/TUI **avant meme qu'une session structurée soit créée**. +- **Racine architecturale identifiée**: le symptôme `NOT_FOUND` n'était qu'un symptôme secondaire d'une tentative de reattach sur une session qui n'a jamais réussi à se stabiliser. Le vrai problème est dans le **pipeline de création/initialisation de session** entre l'action utilisateur et la stabilisation effective. -### 4) Perimetre minimal propose pour la prochaine correction (non-regressif) -1. **Etape 0 (obligatoire, avant tout code)** : rebuild AppImage depuis `develop`, relancer IdeA, refaire le repro utilisateur reel. Ne pas coder avant ce resultat. -2. Si le symptome persiste : instrumenter (log temporaire, retire avant merge) les transitions reelles de `cellMode`, `customCliAvailable`, `effectiveCustomCliAvailable`, `trustedCustomCli` (LayoutGrid) ET le cycle de vie de l'effet `openOrAttach` / des appels `launchAgentChat`/`reattachAgentChat` (CustomAgentChatView) sur un repro utilisateur reel, capture avant toute nouvelle modif. -3. Ne pas retoucher une 4e fois `shouldFallbackCustomCliMode`/l'effet de fallback de `LayoutGrid.tsx` sans preuve de trace nouvelle — 3 iterations dessus sans effet observable est en soi un signal que soit l'hypothese est fausse, soit la validation ne portait pas sur le bon binaire (cf §1). -4. Correctif candidat le plus probable si la piste §3 se confirme : stabiliser l'effet `openOrAttach` pour qu'il ne reagisse pas a son propre `onSessionId` (ex. distinguer une mise a jour "externe" de `sessionId` d'une mise a jour "auto-emise", via un ref plutot que la prop brute dans les deps). +### Hypothèses INVALIDÉES (ne plus jamais retenter): +- ✗ Fallback premature dans `LayoutGrid.tsx` pendant chargement catalogue (3 tentatives sans effet) +- ✗ Echo `sessionId` auto-émis dans `CustomAgentChatView` (fixé mais n'a pas résolu le symptôme) +- ✗ Absorption de la forme brute `NOT_FOUND` (symptôme secondaire, pas la racine) +- ✗ `reattach_agent_chat` backend (idempotent par design, jamais démontré fautif) -### 5) A consigner pour eviter de repasser sur les fausses pistes -- Toujours verifier la date de build de l'AppImage installee vs. la date des commits de fix avant d'interpreter un retest utilisateur comme un echec du correctif. -- La piste "fallback premature pendant chargement catalogue" (LayoutGrid.tsx) a ete testee 3x (commits `51bda204`, `61055779`, `e9e4623e`) sans confirmation terrain valide (cf §1) — ne pas la considerer refutee tant que le rebuild+retest n'a pas ete fait proprement. -- `reattach_agent_chat` backend est idempotent par design (generation supersede) — ecarter la piste "double attach tue la session cote serveur" sauf nouvelle preuve. -- Piste ouverte et non testee : boucle d'effet `sessionId` dans `CustomAgentChatView.tsx` (cf §3) — a instrumenter avant de patcher. +### Périmètre DEVFRONTEND (nouvelle hypothèse): +- Investiger le pipeline complet d'initialisation custom — depuis l'action utilisateur jusqu'à la stabilisation de la session — en identifiant où la transition custom→Plain se produit AVANT même l'appel `launch_agent`. +- Vérifier particulièrement si un effet React ou une validation dans `CustomAgentChatView` ou `LayoutGrid` interrompt l'ouverture AVANT la création de session. -## 2026-08-05 — Verification binaire / rebuild AppImage -- Decision Git: rester sur `develop`, aucune nouvelle branche tant qu'on est en simple verification binaire. `develop` contient deja le merge `66b9c34b` et les 3 correctifs frontend lies au ticket. -- Build frontend execute avec succes: `npm --prefix frontend run build`. -- Bundle Tauri AppImage execute avec succes depuis `crates/app-tauri/` via le workflow `build-appimage`: - `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` -- Artefact produit avec succes: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` -- Verification des dates: - - AppImage installee actuelle: `2026-08-03 09:39:38 +0200` — `/home/anthony/Documents/IdeA_0.3.0_amd64.AppImage` - - AppImage rebuild ticket #149: `2026-08-05 14:40:14 +0200` — `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` -- Conclusion de cette tentative: le ticket n'est **pas** encore un echec de correctif code. Le repro utilisateur doit etre refait sur ce nouveau binaire, apres remplacement manuel de l'AppImage installee puis relance d'IdeA. -- Etape suivante obligatoire avant toute 4e modif frontend: remplacer l'AppImage installee par l'artefact rebuild, relancer IdeA, puis retester la CLI custom. Si le symptome persiste sur ce binaire date du 2026-08-05 14:40, alors seulement ouvrir une nouvelle iteration de correction sur la piste `CustomAgentChatView.tsx` / boucle `sessionId`. +### Périmètre DEVBACKEND (nouvelle hypothèse): +- Vérifier la logique d'initialisation de session structurée côté Rust — en particulier si `launch_agent` peut échouer silencieusement ou retourner un état non valide qui déclenche un fallback frontend. -## 2026-08-05 — Nouveau retour utilisateur apres nouvelles tentatives -- Retour utilisateur explicite: "ce n'est toujours pas bon" ; le meme symptome persiste apres plusieurs tentatives de fix. -- Symptome re-decrit par l'utilisateur: "la CLI custom s'ouvre une demie seconde puis se ferme directement vers le Plain". -- Consigne utilisateur explicite a conserver pour la suite: **documenter toutes les tentatives dans ce carnet pour ne pas refaire les memes erreurs**. -- Decision Main pour cette iteration: ne pas repartir sur une intuition vague ni re-appliquer la meme correction sur `LayoutGrid.tsx` sans preuve nouvelle. Repartir d'un cadrage Architecture puis d'une implementation ciblee avec traces d'essai consignees ici. -- Regle operative pour les prochaines entrees de carnet sur ce ticket: - 1. indiquer la commande ou la manip reelle executee, - 2. indiquer le commit/branch ou le binaire teste, - 3. indiquer le resultat exact observe, - 4. indiquer pourquoi la tentative suivante change d'hypothese au lieu de repeter la precedente. +### Règle stricte pour les prochaines entrées de carnet: +1. Toujours vérifier si le symptôme observé se produit **avant** ou **après** la création de session structurée +2. Si avant: se concentrer sur le pipeline d'initialisation, pas sur la gestion des erreurs de session +3. Si après: alors seulement considérer la gestion `NOT_FOUND` / reattach +4. Documenter explicitement le point chronologique exact du fail dans chaque tentative -## 2026-08-05 — Decision Git et instrumentation frontend -- Decision Git: ouvrir une branche dediee `feature/ticket149-customchat-session-instrumentation` a partir de `develop` au commit `4d8b69af`, car cette 4e iteration change d'hypothese et ne doit pas etre melangee avec les 3 fixes precedents. -- Manip reelle cote DevFrontend: instrumentation temporaire ajoutee dans `frontend/src/features/agents/CustomAgentChatView.tsx` et `frontend/src/features/layout/LayoutGrid.tsx`, sans fix fonctionnel et sans commit pour l'instant. -- Instrumentation posee: - 1. `CustomAgentChatView.tsx` loggue chaque execution de `openOrAttach` avec timestamp, `sessionId` recu et compteur d'execution. - 2. `CustomAgentChatView.tsx` loggue debut/succes/erreur pour `reattachStructuredSession`, `recoverStructuredSession` et `launchAgentChat`, avec details d'erreur (`code`, `message`, `name`, `raw`). - 3. `LayoutGrid.tsx` loggue chaque `vm.setSession` avec ancienne valeur, nouvelle valeur, `nodeId`, `cellMode`, `agentId` et site d'appel (`custom`, `plain`, `plain-background-attach`, `mode-switch`). - 4. `LayoutGrid.tsx` loggue chaque evaluation de `shouldFallbackCustomCliMode` avec ses inputs complets et son resultat, sans modifier la logique de fallback. -- Observations techniques de cette tentative: - - la piste `LayoutGrid.tsx` n'a pas ete retouchee fonctionnellement ; on evite volontairement une 4e variation speculative du meme fallback. - - la preuve statique relevee par DevFrontend confirme que le champ `session` est partage entre la vue custom et la vue plain, et que `CustomAgentChatView` peut reecrire `sessionId` via `onSessionIdRef.current(...)` puis repasser par `vm.setSession`, ce qui justifie l'instrumentation de cette boucle plutot qu'un nouveau patch a l'aveugle. -- Commandes executees et resultat: - 1. `git status --short --branch` -> succes ; branche `feature/ticket149-customchat-session-instrumentation`, 2 fichiers modifies. - 2. `npm run typecheck` -> succes, code de sortie 0. - 3. `npx vitest run src/features/agents/CustomAgentChatView.test.tsx src/features/layout/LayoutGrid.chat.test.tsx` -> succes ; 2 fichiers, 16 tests. - 4. `npm test` -> succes ; 116 fichiers, 1096 tests. - 5. `npm run build` -> succes ; `tsc --noEmit && vite build`, 502 modules transformes. -- Particularites de sortie observees: - - les commandes npm emettent avant script un message parasite `Fatal Python error: Failed to import encodings module`, mais sortent avec code 0. - - Vitest affiche aussi des erreurs attendues de tests d'ErrorBoundary/DI et des avertissements jsdom canvas ; verdict final vert. -- Conclusion de cette tentative: - - aucune correction fonctionnelle n'est encore appliquee ; cette iteration sert a capturer une trace exploitable sur le repro reel. - - prochaine etape obligatoire: reproduire le bug dans l'app avec la console ouverte et filtrer les logs `[ticket149]` pour capturer la sequence complete (`openOrAttach:start`, `launchAgentChat`, `reattachStructuredSession`, `vm.setSession`, `shouldFallbackCustomCliMode`). - - la tentative suivante devra partir de cette trace runtime et non d'une nouvelle hypothese speculative sur `LayoutGrid.tsx`. - -## 2026-08-05 — Correctif minimal CustomAgentChatView/sessionId echo -- Branche reelle: `feature/ticket149-customchat-session-instrumentation`, depart de cette reprise sur HEAD `525ea94b`, commit produit `ce9ba0dc` (`fix(chat): ignore self-emitted custom session echoes`). -- Manip/code reel: - 1. inspection statique de `frontend/src/features/agents/CustomAgentChatView.tsx` et du test co-localise ; - 2. correction limitee a `CustomAgentChatView.tsx`: separation d'un `sessionId` externe (`externalSessionId`) et des `sessionId` auto-emis par le composant via `publishSessionId` / `selfEmittedSessionIdRef` ; - 3. l'effet `openOrAttach` ne depend plus de la prop brute `sessionId`, donc l'echo parent d'un `onSessionId(launched.sessionId)` ne nettoie plus l'ouverture en cours et ne relance plus `reattachStructuredSession` ; - 4. aucun changement fonctionnel dans `LayoutGrid.tsx`. -- Test de non-regression ajoute: `CustomAgentChatView.test.tsx` simule un parent qui reinjecte le `sessionId` publie par le composant et verifie qu'un lancement neuf ne produit qu'un seul `launchAgentChat` et un seul `reattachAgentChat`. -- Commandes executees et resultat: - 1. `npx vitest run src/features/agents/CustomAgentChatView.test.tsx` -> succes ; 1 fichier, 8 tests. - 2. `npx vitest run src/features/layout/LayoutGrid.chat.test.tsx` -> succes ; 1 fichier, 9 tests. - 3. `npm test` -> succes ; 116 fichiers, 1097 tests. - 4. `git diff --check` -> succes. - 5. tentative locale `git add ... && git commit ...` -> echec sandbox attendu: impossible de creer `.git/index.lock` (`Read-only file system`) ; delegation a l'agent Git. - 6. agent Git -> commit cree `ce9ba0dc`, worktree propre, `LayoutGrid` non touche. -- Observation importante pendant les tests: - - une premiere version du garde-fou a fait echouer `LayoutGrid.chat.test.tsx` car l'effet dependait encore de la prop brute et le cleanup React annulait l'ouverture en cours, laissant `opening=true`. - - la version commitee corrige ce point en filtrant l'echo dans un effet separe et en ne relancant `openOrAttach` que sur changement externe effectif. -- Resultat observe: - - preuve statique traitee: la boucle d'effet `sessionId` auto-emis -> parent -> prop -> `openOrAttach` est neutralisee. - - validation runtime utilisateur non faite dans ce tour ; le symptome terrain doit etre reteste sur un binaire reconstruit contenant `ce9ba0dc`. -- Suite si le bug persiste encore en repro utilisateur: - 1. ne pas refaire une 5e variation speculative de `LayoutGrid.tsx`; - 2. rebuild/reinstall AppImage depuis la branche contenant `ce9ba0dc`, relancer IdeA, puis retester ; - 3. si la cellule retombe encore vers Plain/TUI, capturer les logs `[ticket149]` au moment exact du repro et comparer: `openOrAttach:self-session-echo:skip`, `vm.setSession`, `shouldFallbackCustomCliMode`, `customCliAvailable`, `effectiveCustomCliAvailable`, `trustedCustomCli`; - 4. si les logs montrent que `openOrAttach` reste stable, la prochaine hypothese doit sortir de `CustomAgentChatView` et porter sur la condition de rendu `customCliAgent/customCliProfile/effectiveCustomCliAvailable` ou sur un evenement externe qui remplace le mode/vue, avec trace runtime avant patch. - -## 2026-08-05 — Nouveau symptome apres le fix session echo -- Retour utilisateur recu apres `ce9ba0dc`: la CLI custom peut maintenant se lancer, mais l'UI affiche l'erreur exacte `not found: structured session 69b57638-0ac7-4a79-8252-e0436a3265f6`. -- Changement de symptome important: on n'est plus sur la retombee immediate vers Plain/TUI telle que documentee plus haut ; on est maintenant sur un echec de rattachement/reutilisation d'une session structuree. -- Verification statique Main (sans nouvelle implementation a ce stade): - 1. `frontend/src/features/agents/CustomAgentChatView.tsx` est cense **absorber** `NOT_FOUND` sur `reattachAgentChat` puis relancer une session fraiche, y compris pour un `sessionId` stale restaure depuis le parent ; les tests couvrent deja ce cas. - 2. Le meme composant sait aussi recuperer d'un premier `launchAgentChat` qui renvoie un `sessionId` mort, a condition qu'un second launch/reattach reussisse ; ce cas est aussi teste. - 3. Voir quand meme cette erreur dans l'UI suggere donc plutot l'un de ces ecarts restants: - - l'erreur reelle renvoyee par `invoke(...)` n'est pas typée `code: "NOT_FOUND"` cote frontend, donc `isNotFound(...)` ne la reconnait pas et elle remonte telle quelle ; - - ou bien `launch_agent` renvoie lui-meme un `sessionId` structure qui n'est deja plus present dans `structured_sessions` au moment du `reattach`, potentiellement plus d'une fois, ce qui epuise la logique de retry et surface finalement `not found: structured session ...`. -- Ownership provisoire pour la reprise: - - piste prioritaire **frontend/runtime contract**: confirmer la forme exacte de l'erreur recue par `CustomAgentChatView` (`code`, `message`, `name`, `raw`) dans les logs `[ticket149]` deja poses ; - - piste secondaire **backend structured registry**: si `code === "NOT_FOUND"` est bien present sur un `sessionId` fraichement renvoye par `launch_agent`, alors l'anomalie bascule cote creation/enregistrement/liveness de `structured_sessions`. -- Commandes de lecture executees par Main pour ce recadrage: - 1. `git status --short --branch` -> branche courante `feature/ticket149-customchat-session-instrumentation`, avec un changement non lie `.ideai/idea-android-plugin.json` deja present ; - 2. `git log --oneline --decorate -n 12` -> HEAD `62ac05a0` au-dessus de `ce9ba0dc` ; - 3. lecture de `frontend/src/features/agents/CustomAgentChatView.tsx`, de ses tests, et de `crates/app-tauri/src/commands.rs` autour de `reattach_agent_chat` / `launch_agent`. -- Blocage de pilotage dans ce tour: - - `idea_ask_agent(Architect)` et `idea_ask_agent(Git)` ont tous deux repondu `You've hit your session limit · resets 4:50pm (Europe/Paris)` ; la delegation specialisee est donc temporairement indisponible jusqu'au **2026-08-05 16:50 Europe/Paris**. -- Etape suivante imposee a la reprise apres 16:50: - 1. refaire la delegation `Architect` pour trancher frontend vs backend sur ce nouveau symptome ; - 2. faire trancher `Git` sur la branche de travail a conserver/reprendre ; - 3. envoyer a `DevFrontend` une tache d'instrumentation/verification du contrat d'erreur si `code` manque ; - 4. envoyer a `DevBackend` une tache de verification de l'enregistrement/liveness `structured_sessions` si un `sessionId` fraichement lance ressort deja en `NOT_FOUND` ; - 5. faire valider par `QA` sur repro reel avec le message exact et, si possible, les logs `[ticket149]` au moment du repro. \ No newline at end of file +## 2026-08-05 — Nouvelle preuve runtime: `returned cellKind=pty; expected chat` +- **Retour utilisateur exact**: `custom CLI launch for agent a6c6ea12-bfc6-4bdc-8031-324102dfa34d in project 97b49ac2-8376-4aa3-8ea9-bf3ac81d0023 returned cellKind=pty; expected chat. sessionId=28b18fd2-e70c-4509-a633-e57e568234d9; nodeId=3e5d083c-4d04-41d6-a4e9-2970fc5b1fd6`. +- **Ce que cette preuve tranche**: + - le frontend a bien envoye une intention `chat` et a correctement refuse une reponse backend routee en `pty` ; + - le symptome n'est donc plus un fallback UI silencieux ni un `NOT_FOUND` tardif ; + - la prochaine cible de correction est le **routage backend/launcher humain** ou le **contrat de profil structured**, pas `LayoutGrid.tsx` ni un nouveau handling frontend du `NOT_FOUND`. +- **Retour Architecture**: + - cause probable: profil de l'agent sans `structured_adapter` effectif **ou** routage backend qui ne transforme pas l'intention `cellKind:"chat"` en exigence structured ; + - `cellKind` cote DTO est derive de la presence d'une session structured, donc `pty` prouve l'absence de session structured reelle au runtime. +- **Retour DevFrontend**: + - le frontend fait maintenant ce qu'on attend face a `pty` ; + - le message observe vient explicitement du garde `launchAgentChat()` et constitue une preuve que le runtime a renvoye `cellKind: "pty"` a une demande `chat`. +- **Retour DevBackend**: + - points de verite signales: `crates/application/src/agent/lifecycle.rs` pour le routage `LaunchAgent::execute`, `crates/backend/src/dto.rs` pour la derivation de `cellKind`, `crates/app-tauri/src/commands.rs` pour la conversion de la requete Tauri ; + - cause probable la plus plausible: le launch humain ne propage pas toujours correctement l'intention `chat` jusqu'au routage structured, ce qui laisse un fallback PTY possible. +- **Hypotheses INVALIDÉES supplementaires**: + - ✗ refaire un patch `CustomAgentChatView` pour tolérer `pty` ; ce serait masquer un contrat casse ; + - ✗ revenir encore sur les effets de chargement catalogue / `LayoutGrid.tsx` ; la preuve runtime est plus forte ; + - ✗ traiter `sessionId=28b18fd2-e70c-4509-a633-e57e568234d9` comme une vraie session structured ; le backend a explicitement renvoye `cellKind=pty`. +- **Règles anti-boucle a respecter desormais**: + 1. Toute nouvelle tentative doit noter si le correctif vise **profil/config**, **routing backend**, ou **frontend** ; ne plus melanger ces pistes dans une meme iteration. + 2. Aucun nouveau patch frontend de fallback/reattach tant qu'on n'a pas prouve que le backend renvoie bien `cellKind:"chat"`. + 3. Toute validation doit citer la commande exacte et le type de preuve: test unitaire, test integration, ou repro runtime AppImage/Tauri. + 4. Si un message futur mentionne encore `returned cellKind=pty; expected chat`, classer immediatement l'echec comme **routage/backend ou contrat profil**, pas comme regression `NOT_FOUND`. +- **Prochaine etape imposee**: + - faire valider par QA les tests backend/frontend lies a cette propagation `chat -> structured`, puis demander a Git de cadrer le commit local du correctif backend si la worktree contient bien le diff correspondant. diff --git a/.ideai/tickets/149/issue.md b/.ideai/tickets/149/issue.md index 7751956..079d51d 100644 --- a/.ideai/tickets/149/issue.md +++ b/.ideai/tickets/149/issue.md @@ -1,19 +1,29 @@ --- id: "1bd74960-361f-4083-acff-4c0b55cd920f" number: 149 -title: "CLI custom: fallback silencieux vers Plain/TUI avant chargement du catalogue agent/profil" -status: "inProgress" +title: "CLI custom: une demande chat est routee en PTY au lieu d'une session structured" +status: "closed" priority: "high" sprint: null links: [{"target":"#148","kind":"relatesTo"},{"target":"#147","kind":"relatesTo"}] -agentRefs: [{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"}] +agentRefs: [{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"},{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"}] attachments: [] createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"user"} createdAt: 1785930073255 -updatedAt: 1785937428431 -version: 15 +updatedAt: 1785964173499 +version: 25 --- -Bug report utilisateur du 2026-08-05: la CLI custom ne se lance plus; à l'ouverture elle se ferme immédiatement et la cellule revient sur Plain/TUI. Diagnostic Architecture: bug distinct de #148. Dans `frontend/src/features/layout/LayoutGrid.tsx`, `cellMode` restauré à `custom` depuis le storage est forcé trop tôt vers `tui` par l'effet garde-fou `if (!customCliAvailable && cellMode !== \"tui\") setCellMode(\"tui\")`, alors que `agents`/`profiles` sont encore vides pendant leur chargement asynchrone initial. Résultat: la préférence `custom` est écrasée silencieusement avant même que la vue puisse se monter. Objectif: retarder ce fallback jusqu'à la fin du premier chargement du catalogue, couvrir par test de non-régression, valider QA, puis rebuild AppImage Linux. +Bug report utilisateur confirme le mercredi 5 aout 2026: la CLI custom de l'agent Main peut de nouveau etre lancee, mais l'ouverture echoue avec le message runtime exact `custom CLI launch for agent a6c6ea12-bfc6-4bdc-8031-324102dfa34d in project 97b49ac2-8376-4aa3-8ea9-bf3ac81d0023 returned cellKind=pty; expected chat. sessionId=28b18fd2-e70c-4509-a633-e57e568234d9; nodeId=3e5d083c-4d04-41d6-a4e9-2970fc5b1fd6`. -Reouvert le 2026-08-05 apres retest utilisateur: le symptome persiste. La CLI custom s'ouvre environ une demi-seconde puis se referme directement vers Plain/TUI. \ No newline at end of file +Le ticket a ete initialement ouvert sur une hypothese frontend de fallback silencieux vers Plain/TUI pendant le chargement du catalogue agent/profil. Cette hypothese n'est plus la piste principale. La preuve runtime ci-dessus tranche que le frontend demande bien une cellule `chat`, mais que le runtime/backend renvoie effectivement `cellKind=pty`; le garde frontend rejette alors correctement la reponse au lieu de publier un faux `sessionId` structured. + +Diagnostic courant consolide le mercredi 5 aout 2026: +- le message `not found: structured session ...` doit etre traite comme symptome secondaire historique, pas comme cause racine actuelle ; +- la prochaine cible de correction est le routage backend/human launcher et/ou la propagation du contrat `cellKind: chat -> require_structured`, pas un nouveau fallback `LayoutGrid.tsx` ; +- DevBackend a localise les points de verite dans `crates/app-tauri/src/commands.rs`, `crates/application/src/agent/lifecycle.rs`, `crates/backend/src/lib.rs` et `crates/backend/src/dto.rs` ; +- QA a valide sur l'arbre courant, le mercredi 5 aout 2026, les tests cibles backend/frontend couvrant cette propagation. + +Objectif du ticket: garantir qu'un lancement custom CLI demande en `chat` ouvre une vraie session structured quand le profil le permet, et n'aboutit jamais a un retour `pty` silencieux ou a une boucle de reattach secondaire. + +Voir le carnet pour l'historique detaille, les hypotheses invalidees et les regles anti-boucle. \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index be7c97a..72b66a1 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 150 + "nextNumber": 160 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index c47c91b..cdcf3f4 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -1949,18 +1949,145 @@ { "issueRef": "#149", "path": "149", - "title": "CLI custom: fallback silencieux vers Plain/TUI avant chargement du catalogue agent/profil", - "status": "inProgress", + "title": "CLI custom: une demande chat est routee en PTY au lieu d'une session structured", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ + "fe887179-933f-47d4-960f-c3b06827f86c", "8f7da528-58df-4315-97e9-0562230ecc19" ], "createdBy": { "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785937428431 + "updatedAt": 1785964173499 + }, + { + "issueRef": "#150", + "path": "150", + "title": "CLI UI: messages utilisateur affichés en double dans la conversation agent", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785964248745 + }, + { + "issueRef": "#151", + "path": "151", + "title": "CLI UI: chevauchement des boutons dans la barre supérieure pendant une conversation agent", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785945386695 + }, + { + "issueRef": "#152", + "path": "152", + "title": "CLI UI: mauvaise mise à l’échelle sur conversation longue, barre de chat hors écran", + "status": "qa", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785964233590 + }, + { + "issueRef": "#154", + "path": "154", + "title": "Foundation: durable agent/chat attachments pipeline with sandbox-safe file access", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785964785338 + }, + { + "issueRef": "#155", + "path": "155", + "title": "Custom chat: paste image from clipboard into composer", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785964785374 + }, + { + "issueRef": "#156", + "path": "156", + "title": "Foundation: unified streaming progress/event model across AI profiles", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785965415569 + }, + { + "issueRef": "#157", + "path": "157", + "title": "CLI custom: surface all available agent progress, MCP activity, and inter-agent delegation flow", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1785965415603 + }, + { + "issueRef": "#158", + "path": "158", + "title": "[Bug] popup reprise de conversation intempestive", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + ], + "createdBy": { + "kind": "user" + }, + "updatedAt": 1785965476823 + }, + { + "issueRef": "#159", + "path": "159", + "title": "[UI] Pastille d'activité de projet", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "user" + }, + "updatedAt": 1785965966515 } ] } \ No newline at end of file