--- name: ticket284-cross-project-contact-plugin-assignment description: memory note ticket284-cross-project-contact-plugin-assignment metadata: type: project --- # Ticket #284 — contact cross-project et assignation plugin par agent Le ticket #284 a été livré et mergé localement dans `develop` le 2026-09-08. ## Correctif cross-project Cause corrigée : `correlationId` servait surtout au diagnostic, `idea_project_cancel_agent` pouvait arrêter la cible fournie sans la relier à une demande active, et la projection live-state écrivait principalement côté projet cible. Le service maintient maintenant un registre mémoire des demandes actives par projet/agent appelant + `correlationId`, refuse les corrélations vides/dupliquées, empêche la redirection d’un cancel vers une autre cible, et projette aussi l’appelant `Waiting` puis `Done` dans son propre workstate avec `correlationId` exposé. Les tools cross-project ask/cancel restent `WriteAction` deny-by-default, mais le catalogue/erreur indique plus clairement qu’il faut autoriser `idea_project_ask_agent` / `idea_project_cancel_agent`. ## Assignation plugin par agent L’API et la persistance existaient déjà via `.ideai/project-plugins.json` et les commandes desktop `plugin_*`. Le défaut utilisateur était surtout la découvrabilité. La surface `Settings projet > Plugins` expose désormais un bouton explicite `Attribuer aux agents`, ouvrant le panneau Agents, et la section agent affiche `Capabilities de plugins — {agent}` avec séparation skills/tools MCP. ## Validation QA vert : cargo check ciblé, tests `orchestrator_service` 79/79, `mcp_server` 40/40, `domain live_state` 15/15, test frontend plugin settings 3/3, `npm --prefix frontend run build`, `cargo fmt --all -- --check`, `git diff --check`. AppImage rebuilt : `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. ## Réserve opérationnelle Le binaire en cours d’exécution reste l’ancienne AppImage tant que l’utilisateur ne remplace pas `/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage` et ne relance pas IdeA. Ne pas automatiser cette étape depuis une session active, car elle tue l’orchestrateur.