chore(tickets): journalise le correctif routing chat vs PTY #149

- 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 <noreply@anthropic.com>
This commit is contained in:
2026-08-05 23:40:03 +02:00
parent 937ea07df1
commit ee35c15958
4 changed files with 259 additions and 148 deletions

View File

@ -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.
## 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.