--- id: "66e80f94-780b-4856-806d-ba4b96673630" number: 117 title: "Garantir la synchronie métier de idea_ask_agent malgré les background tasks" status: "closed" priority: "high" sprint: null links: [] agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] attachments: [] createdBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"cd0b4cf1-1bef-4fae-ade5-f0a6b49bbaf5"} createdAt: 1785500280516 updatedAt: 1785503128343 version: 7 --- Constat : quand un agent `A` délègue une demande à un agent `B` via `idea_ask_agent`, `B` peut lancer une background task puis terminer son tour avant que cette tâche ne finisse. Dans ce cas, `A` peut recevoir une pseudo-réponse terminale trop tôt, alors que le travail réel n'est pas terminé. Décision produit validée : `idea_ask_agent` doit rester synchrone d'un point de vue métier. Cela implique : - `A` ne doit jamais recevoir comme réponse métier finale un simple "task lancée" si le résultat utile dépend encore d'une background task. - si `B` a besoin d'une background task pour produire sa réponse, la délégation `A -> B` reste ouverte. - la background task est une étape interne du traitement de `B`, pas une réponse à `A`. - à la fin de la task, IdeA réveille `B`, puis `B` rend la vraie réponse finale. - `A` reste en attente du rendez-vous logique, même si techniquement le tour initial de `B` s'est terminé. Objectif : Faire en sorte qu'une background task lancée pendant un `idea_ask_agent` soit corrélée au rendez-vous inter-agent en cours, et que ce rendez-vous reste ouvert jusqu'à la réponse finale métier de `B`. Invariants à garantir : - `idea_ask_agent` ne se termine jamais par "task lancée" si le résultat utile dépend encore d'une background task. - toute background task lancée pendant une délégation porte la corrélation du rendez-vous source. - la complétion de task réveille `B`, pas `A` directement. - `B` transforme ensuite le résultat en vraie réponse finale à `A`. - la réponse capturée pour `A` n'est émise qu'après clôture logique du travail. - reboot, cancel, timeout et échec de task ne doivent pas casser cette corrélation. Découpage attendu : 1. Étendre le modèle de corrélation pour rattacher une background task à un rendez-vous délégué. 2. Introduire un état explicite de rendez-vous du type `WaitingOnBackgroundTask` ou équivalent. 3. Empêcher la clôture terminale d'un `idea_ask_agent` tant qu'une task corrélée est encore ouverte. 4. À la complétion, réveiller `B`, injecter le résultat dans son inbox, puis laisser `B` répondre à `A`. 5. Ajouter les tests de reprise après reboot, timeout, cancel et double complétion. Critères de validation : - `A` délègue à `B`, `B` lance une task longue, `A` n'obtient pas de faux terminal. - à la fin de la task, `B` est réveillé et répond finalement à `A`. - après redémarrage, la réponse finale revient encore à `A`. - échec ou annulation de task produisent une réponse terminale cohérente côté `A`. - aucune complétion ne reste orpheline hors du rendez-vous initial.