diff --git a/.ideai/agents/git.md b/.ideai/agents/git.md
index f27b4041..9b132386 100644
--- a/.ideai/agents/git.md
+++ b/.ideai/agents/git.md
@@ -94,9 +94,10 @@ tu le dis.
## 4. Conventions
-- **Messages de commit** : en **français**, style Conventional Commits cohérent avec
+- **Messages de commit** : en **anglais**, style Conventional Commits cohérent avec
l'historique : `feat(scope): …`, `fix(scope): …`, `chore(scope): …`, `docs(scope): …`,
- `refactor(scope): …`. Corps multi-ligne expliquant le **pourquoi** quand utile.
+ `refactor(scope): …`. Le ou les tickets sur lesquels portent le commit.
+ Corps multi-ligne expliquant le **pourquoi** quand utile.
- **Atomicité** : un commit = une intention cohérente. Tu sépares le code de feature de
l'état runtime (`.ideai/` conversations, layouts, manifestes) et des docs.
- **Co-author** : termine les messages de commit par
diff --git a/.ideai/agents/main.md b/.ideai/agents/main.md
index b6cdd443..4043b02d 100644
--- a/.ideai/agents/main.md
+++ b/.ideai/agents/main.md
@@ -104,9 +104,4 @@ Si une réflexion est récurrente et aboutit toujours à la même solution, cré
Si aucun ticket n'existe pour la demande de l'utilisateur, créé le. S'il existe, réouvre le.
Mets à jour le status des tickets que tu traites: in progress, closed, QA.
Mets a jour le carnet des tickets que tu traites en cas de futur reprise de ce ticket pour éviter
-de boucler plusieurs fois sur les memes soucis.
-
-A chaque build de l'appimage, j'aimerais que tu demandes à Git d'incrémenter la version, par le tag,
-du commit sur lequel à été faite l'appimage sous cette forme: vx.y.z (donc par exemple v1.0.0).
-Incrémente x pour chaque build faite sur la branche main,y pour chaque build faite sur la branche develop
-et z pour chaque build faite sur une autre branche.
\ No newline at end of file
+de boucler plusieurs fois sur les memes soucis.
\ No newline at end of file
diff --git a/.ideai/agents/ux.md b/.ideai/agents/ux.md
index a9a565f3..fb602d30 100644
--- a/.ideai/agents/ux.md
+++ b/.ideai/agents/ux.md
@@ -101,5 +101,3 @@ Ta place dans le cycle dépend de l'enjeu :
- Avec **Architect** : dis explicitement ce que la surface exige de la donnée. Si sa
contrainte technique borne ta conception, propose une alternative plutôt que de
concéder en silence.
-- En fonction des modifications à apporter, tu soulignes la necessité de répliquer les modifications
- UI sur les interfaces Web PC et Web téléphone
diff --git a/.ideai/tickets/117/carnet.md b/.ideai/tickets/117/carnet.md
index 67f9ab6f..c03d4864 100644
--- a/.ideai/tickets/117/carnet.md
+++ b/.ideai/tickets/117/carnet.md
@@ -1,8 +1,8 @@
---
issueRef: "#117"
-version: 12
-updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1787336067149
+version: 13
+updatedBy: {"kind":"user"}
+updatedAt: 1788789622644
---
2026-08-21 Main
- Ticket rouvert pour livraison effective sur la branche backend dédiée `feature/117-ask-agent-sync-background-tasks` depuis `develop` @ `c1d7f6d`.
diff --git a/.ideai/tickets/117/issue.md b/.ideai/tickets/117/issue.md
index 5ac49ae9..f8f779f3 100644
--- a/.ideai/tickets/117/issue.md
+++ b/.ideai/tickets/117/issue.md
@@ -2,17 +2,17 @@
id: "66e80f94-780b-4856-806d-ba4b96673630"
number: 117
title: "Garantir la synchronie métier de idea_ask_agent malgré les background tasks"
-status: "inProgress"
+status: "closed"
priority: "critical"
sprint: null
links: []
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
attachments: []
createdBy: {"kind":"user"}
-updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"user"}
createdAt: 1785500280516
-updatedAt: 1787336067149
-version: 12
+updatedAt: 1788789622644
+version: 13
---
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é.
diff --git a/.ideai/tickets/155/carnet.md b/.ideai/tickets/155/carnet.md
index 389abe3c..33fff73f 100644
--- a/.ideai/tickets/155/carnet.md
+++ b/.ideai/tickets/155/carnet.md
@@ -1,8 +1,8 @@
---
issueRef: "#155"
-version: 13
-updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1786346556578
+version: 14
+updatedBy: {"kind":"user"}
+updatedAt: 1788789622554
---
## 2026-08-06 — Reopened from user validation on AppImage
- User reports that clipboard paste in the custom CLI chat still does not work in practice.
diff --git a/.ideai/tickets/155/issue.md b/.ideai/tickets/155/issue.md
index de487567..aa8a2a98 100644
--- a/.ideai/tickets/155/issue.md
+++ b/.ideai/tickets/155/issue.md
@@ -2,16 +2,16 @@
id: "620bc08f-835c-483c-a9f1-59690ebf8ab5"
number: 155
title: "Custom chat: paste image/fichier depuis le clipboard dans le composer"
-status: "inProgress"
+status: "closed"
priority: "medium"
sprint: null
links: [{"target":"#154","kind":"dependsOn"}]
agentRefs: [{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"},{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","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: 1785964740363
-updatedAt: 1786346556578
-version: 13
+updatedAt: 1788789622554
+version: 14
---
Demande utilisateur requalifiée le 2026-08-06: la custom CLI ne permet toujours pas de coller un fichier dans la barre de chat, comme dans une TUI native Claude Code ou Codex. Le scope ne doit pas rester limité au seul collage d'image: il faut couvrir au minimum les fichiers/images exposés par le clipboard et les convertir en attachments utilisables dans le composer custom, via le pipeline d'attachments existant.
\ No newline at end of file
diff --git a/.ideai/tickets/185/carnet.md b/.ideai/tickets/185/carnet.md
index 15d2d5a4..3a655f70 100644
--- a/.ideai/tickets/185/carnet.md
+++ b/.ideai/tickets/185/carnet.md
@@ -1,8 +1,8 @@
---
issueRef: "#185"
-version: 13
-updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1786709806993
+version: 14
+updatedBy: {"kind":"user"}
+updatedAt: 1788789622659
---
2026-08-13
- Constaté depuis Main que `.ideai/permissions.json` est déjà en `allow` global sur read/write/delete/executeBash.
diff --git a/.ideai/tickets/185/issue.md b/.ideai/tickets/185/issue.md
index db60a7a7..407e06e9 100644
--- a/.ideai/tickets/185/issue.md
+++ b/.ideai/tickets/185/issue.md
@@ -2,16 +2,16 @@
id: "3eea8ad2-e8c5-4a1a-881e-dbf129aa60b0"
number: 185
title: "Codex structured sandbox: rétablir l'écriture du project root pour les agents Dev sans perdre l'accès à .git"
-status: "inProgress"
+status: "closed"
priority: "critical"
sprint: null
links: []
agentRefs: [{"agentId":"b4730d7f-c54d-4736-8a04-c6203aa2fd49","role":"assigned"},{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","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: 1786606428812
-updatedAt: 1786709806993
-version: 13
+updatedAt: 1788789622659
+version: 14
---
L'UI expose une policy Allow/Write globale, mais les sessions structurées Codex semblent recevoir un runtime dont les writable_roots sont limités aux racines Git enrichies. Les tests backend actuels verrouillent même que le project root ne soit pas ajouté comme writable root. Impact: Main et potentiellement DevBackend/DevFrontend ne peuvent plus modifier le code applicatif malgré une UI permissive. Objectif: réaligner la projection structured Codex et/ou le plan OS sandbox avec la policy UI voulue, en conservant l'accès Git ajouté récemment.
\ No newline at end of file
diff --git a/.ideai/tickets/196/carnet.md b/.ideai/tickets/196/carnet.md
index edd34aea..90a109de 100644
--- a/.ideai/tickets/196/carnet.md
+++ b/.ideai/tickets/196/carnet.md
@@ -1,8 +1,8 @@
---
issueRef: "#196"
-version: 6
-updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1786709807009
+version: 7
+updatedBy: {"kind":"user"}
+updatedAt: 1788789622674
---
2026-08-14
- Bug utilisateur: les grants accordes dans la page Permissions ne donnent toujours pas l'ecriture au root du projet dans la nouvelle AppImage.
diff --git a/.ideai/tickets/196/issue.md b/.ideai/tickets/196/issue.md
index dcfabb22..4090e3eb 100644
--- a/.ideai/tickets/196/issue.md
+++ b/.ideai/tickets/196/issue.md
@@ -2,16 +2,16 @@
id: "c8ee4aa6-e301-4002-af26-7ca4e537d77a"
number: 196
title: "Permissions page grants do not allow agent write access to project root"
-status: "inProgress"
+status: "closed"
priority: "high"
sprint: null
links: [{"target":"#185","kind":"relatesTo"}]
agentRefs: []
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: 1786704189602
-updatedAt: 1786709807009
-version: 6
+updatedAt: 1788789622674
+version: 7
---
Malgre le fix precedent et une nouvelle AppImage, accorder les permissions dans la page Permissions ne donne toujours pas aux agents l'acces en ecriture au root du projet. Attendu: quand les permissions correspondantes sont accordees dans la page Permissions, les agents doivent pouvoir ecrire dans le root du projet et ses chemins pertinents selon le grant.
\ No newline at end of file
diff --git a/.ideai/tickets/243/carnet.md b/.ideai/tickets/243/carnet.md
index d638738f..7e23cc31 100644
--- a/.ideai/tickets/243/carnet.md
+++ b/.ideai/tickets/243/carnet.md
@@ -1,8 +1,8 @@
---
issueRef: "#243"
-version: 3
+version: 7
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1787476334103
+updatedAt: 1788439323308
---
2026-08-23
- Rebuild AppImage demandé par l’utilisateur.
@@ -11,4 +11,14 @@ updatedAt: 1787476334103
- Bundle Tauri AppImage OK depuis `crates/app-tauri` avec `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage`.
- Artefact produit: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` (114M constatés à 11:10 le 2026-08-23).
- Git a décidé puis posé le tag local `v0.27.0` sur le commit `24c237b` de `develop` après build réussi, conformément à la règle de bump mineur sur `develop`.
-- Point d’attention Git: après le build/tag, deux commits `chore` sans impact code sur l’AppImage buildée ont été ajoutés sur `develop`; le tag reste volontairement sur le commit buildé `24c237b`.
\ No newline at end of file
+- Point d’attention Git: après le build/tag, deux commits `chore` sans impact code sur l’AppImage buildée ont été ajoutés sur `develop`; le tag reste volontairement sur le commit buildé `24c237b`.
+
+2026-09-03
+- Rebuild AppImage redemandé par l’utilisateur.
+- Skill `build-appimage` relu avant exécution.
+- Git a inspecté `develop` HEAD `d7b24ad` et préparé le prochain tag local `v0.39.0` à poser sur ce commit si le build réussit.
+- Build relancé avec shell propre (pollution AppImage évitée via unset `PYTHONHOME`/`PYTHONPATH`).
+- Frontend build OK: `env -u PYTHONHOME -u PYTHONPATH npm --prefix frontend run build`.
+- Bundle Tauri AppImage OK: `env -u PYTHONHOME -u PYTHONPATH bash -lc 'mkdir -p /tmp/idea-cargo-home && cd crates/app-tauri && CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage'`.
+- Artefact produit: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` (114M constatés à 14:41 le 2026-09-03).
+- Git a posé le tag local annoté `v0.39.0` sur `d7b24ad`; `git tag --points-at d7b24ad` retourne `v0.39.0`. Rien poussé.
diff --git a/.ideai/tickets/243/issue.md b/.ideai/tickets/243/issue.md
index c2b07f53..88389dba 100644
--- a/.ideai/tickets/243/issue.md
+++ b/.ideai/tickets/243/issue.md
@@ -11,7 +11,7 @@ attachments: []
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
createdAt: 1787475935659
-updatedAt: 1787476334103
-version: 3
+updatedAt: 1788439323308
+version: 7
---
Reconstruction demandée de l’AppImage Linux IdeA à partir de l’état courant du dépôt, en suivant le workflow validé projet. Le tag Git local de version du commit buildé doit être incrémenté selon la règle projet: x sur main, y sur develop, z sur toute autre branche.
\ No newline at end of file
diff --git a/.ideai/tickets/259/carnet.md b/.ideai/tickets/259/carnet.md
index 0a43d925..33b0d391 100644
--- a/.ideai/tickets/259/carnet.md
+++ b/.ideai/tickets/259/carnet.md
@@ -1,13 +1,15 @@
---
issueRef: "#259"
-version: 3
+version: 5
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
-updatedAt: 1788438656514
+updatedAt: 1788438757480
---
2026-09-03 Main
- Bug reproduit/qualifié: les permissions MCP d’un template semblent perdues après save puis réouverture.
- UX: pas de redesign requis; l’éditeur doit refléter l’état réellement sauvegardé.
- Architect: pas de changement de contrat large; vérifier le mapping wire alias/DTO.
-- Git: a prescrit `fix/259-template-permissions-reopen` depuis `develop`, mais DevFrontend n’a pas pu créer la branche ici (`.git/index.lock: Read-only file system`). Modifs laissées localement, non pushées/non commit.
-- DevFrontend: cause réelle = désalignement de normalisation frontend sur les réponses template (`defaultMcpToolPermissions`/`defaultSystemPermissions` backend non remappés vers `mcpToolPermissions`/`systemPermissions` consommés par l’UI à la réouverture). Correctif local livré avec test de régression adapter + vérifications ciblées vertes.
-- En attente: verdict QA réel sur l’état local actuel, puis Git pour commit/merge si vert.
+- Git: a d’abord prescrit `fix/259-template-permissions-reopen` depuis `develop`. DevFrontend n’a pas pu créer la branche dans son sandbox (`.git/index.lock: Read-only file system`), mais Git a ensuite exécuté la topologie git locale depuis sa propre session.
+- DevFrontend: cause réelle = désalignement de normalisation frontend sur les réponses template (`defaultMcpToolPermissions`/`defaultSystemPermissions` backend non remappés vers `mcpToolPermissions`/`systemPermissions` consommés par l’UI à la réouverture). Correctif livré avec test de régression adapter.
+- QA: vert sur l’état local actuel avec `npm test -- --run src/adapters/http/httpInvoker.test.ts src/features/templates/templates.test.tsx` et `npm run typecheck`.
+- Git: a créé `fix/259-template-permissions-reopen`, commit de fix `4d34ade`, merge local `cd8bca9` dans `develop`, puis commit séparé du store tickets `d7b24ad`. Rien poussé.
+- Résultat: ticket corrigé, validé QA, mergé localement dans `develop`.
diff --git a/.ideai/tickets/259/issue.md b/.ideai/tickets/259/issue.md
index d21099d8..d53825dc 100644
--- a/.ideai/tickets/259/issue.md
+++ b/.ideai/tickets/259/issue.md
@@ -2,7 +2,7 @@
id: "0c7d8e1b-bf25-4620-9eaa-36e545388056"
number: 259
title: "Template permissions do not persist after save"
-status: "qa"
+status: "closed"
priority: "high"
sprint: null
links: []
@@ -11,7 +11,7 @@ attachments: []
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
createdAt: 1788438150527
-updatedAt: 1788438656514
-version: 3
+updatedAt: 1788438757480
+version: 5
---
Dans l’éditeur de template, les permissions ajoutées semblent disparaître après sauvegarde : en revenant sur le template, les cases sont vides. Corriger la persistance/relance de l’état des permissions des templates.
\ No newline at end of file
diff --git a/.ideai/tickets/260/carnet.md b/.ideai/tickets/260/carnet.md
new file mode 100644
index 00000000..21c26856
--- /dev/null
+++ b/.ideai/tickets/260/carnet.md
@@ -0,0 +1,17 @@
+---
+issueRef: "#260"
+version: 8
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788791628015
+---
+# Carnet #260
+
+- Ticket principal cree pour la feature agents cross-project.
+- Sous-tickets: #261 UX closed, #262 Architecture closed, #263 Backend QA, #264 Frontend QA, #265 QA/AppImage inProgress.
+- UX #261 rendu: checkbox `Contactable depuis d’autres projets` dans Permissions agent et template, defaut decoche, texte d'aide distinct agent/template, erreur sauvegarde `La permission n’a pas pu être enregistrée. Réessayez.`
+- Architect #262 rendu: identite canonique `projectId + agentId`, DTO MCP `idea_project_list`, `idea_project_read_context`, `idea_project_list_agents`, `idea_project_ask_agent`, `idea_project_cancel_agent`; runtime minimal projet ferme; reconciliation ouverture projet; queue/busy/cancel indexes par `RuntimeAgentKey(projectId, agentId)`; routage par correlationId requester/target project-scoped.
+- Git: branche root `feature/260-cross-project-agents`; worktrees devs realignes; commits de lot faits puis merges locaux root sans conflit.
+- Backend: commit `9895498` sur `feature/260-backend`, merge root `530ce01`; tests Main verts: `cargo fmt --check`, `cargo check -p application -p infrastructure -p backend -p app-tauri --lib`, `cargo test -p application cross_project --test orchestrator_service`, `cargo test -p infrastructure --test mcp_server`, `cargo test -p application --test template_usecases`, `cargo test -p infrastructure --test template_store`.
+- Frontend: commit `8496507` sur `feature/260-frontend`, merge root `b0f8fe4`; DevFrontend annonce verts: `npm run typecheck`, `npm test -- src/features/permissions/permissions.test.tsx src/features/templates/templates.test.tsx src/adapters/http/httpInvoker.test.ts`, 48 passed.
+- Git verification root apres merge: `npm run typecheck` vert + `cargo +stable check -p application -p infrastructure -p backend -p app-tauri --lib` vert.
+- Etat actuel: pret pour QA complete sur branche integree; aucun push, aucun merge develop/main. Dirty restant attendu: store `.ideai/`/tickets/scripts non lies au code produit.
\ No newline at end of file
diff --git a/.ideai/tickets/260/issue.md b/.ideai/tickets/260/issue.md
new file mode 100644
index 00000000..672a233a
--- /dev/null
+++ b/.ideai/tickets/260/issue.md
@@ -0,0 +1,17 @@
+---
+id: "1f6e430c-d7ca-49cb-8eac-dc885aa593ce"
+number: 260
+title: "Agents cross-project: MCP discovery, permissions et contact inter-projets"
+status: "inProgress"
+priority: "critical"
+sprint: null
+links: []
+agentRefs: [{"agentId":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d","role":"assigned"}]
+attachments: []
+createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+createdAt: 1788773711834
+updatedAt: 1788791628015
+version: 8
+---
+Feature demandée: permettre à un agent IdeA de découvrir les projets IdeA, lire leur contexte, lister les agents explicitement contactables d’un projet avec leur contexte, puis contacter un agent d’un autre projet via MCP avec routage fiable de la réponse vers le bon agent et le bon projet. Contraintes clés: lancer un agent même si son projet n’est pas ouvert; si le projet est ouvert ensuite, l’agent doit être considéré comme déjà lancé; gérer busy/cancel/rendez-vous comme idea_ask_agent; désambiguïser les agents homonymes par projectId + agentId; exposer une permission par agent persistée aussi dans les templates.
\ No newline at end of file
diff --git a/.ideai/tickets/261/carnet.md b/.ideai/tickets/261/carnet.md
new file mode 100644
index 00000000..9c6e45db
--- /dev/null
+++ b/.ideai/tickets/261/carnet.md
@@ -0,0 +1,6 @@
+---
+issueRef: "#261"
+version: 2
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788774465904
+---
diff --git a/.ideai/tickets/261/issue.md b/.ideai/tickets/261/issue.md
new file mode 100644
index 00000000..a37f541f
--- /dev/null
+++ b/.ideai/tickets/261/issue.md
@@ -0,0 +1,17 @@
+---
+id: "5bbf6483-1dfa-4150-90c9-49f8e03f16e8"
+number: 261
+title: "Cross-project agents: cadrage UX permission agent/template"
+status: "closed"
+priority: "high"
+sprint: null
+links: [{"target":"#260","kind":"dependsOn"}]
+agentRefs: [{"agentId":"757430bb-014a-40fa-b82b-f2429dab9766","role":"assigned"}]
+attachments: []
+createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+createdAt: 1788773730333
+updatedAt: 1788774465904
+version: 2
+---
+Définir la surface UI pour rendre un agent contactable depuis d’autres projets IdeA. Probable ajout d’une checkbox dans les permissions d’agent, avec libellés, comportement dans les templates, indication dans les listes d’agents contactables si nécessaire. Doit rester cohérent avec les permissions existantes et persister dans les templates.
\ No newline at end of file
diff --git a/.ideai/tickets/262/carnet.md b/.ideai/tickets/262/carnet.md
new file mode 100644
index 00000000..3b2b88bf
--- /dev/null
+++ b/.ideai/tickets/262/carnet.md
@@ -0,0 +1,6 @@
+---
+issueRef: "#262"
+version: 2
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788774465928
+---
diff --git a/.ideai/tickets/262/issue.md b/.ideai/tickets/262/issue.md
new file mode 100644
index 00000000..2aaa73fc
--- /dev/null
+++ b/.ideai/tickets/262/issue.md
@@ -0,0 +1,17 @@
+---
+id: "94c6e01a-4efc-479a-9b92-d75153160390"
+number: 262
+title: "Cross-project agents: architecture MCP, registry projets et rendez-vous"
+status: "closed"
+priority: "critical"
+sprint: null
+links: [{"target":"#260","kind":"dependsOn"}]
+agentRefs: [{"agentId":"b4730d7f-c54d-4736-8a04-c6203aa2fd49","role":"assigned"}]
+attachments: []
+createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+createdAt: 1788773730351
+updatedAt: 1788774465928
+version: 2
+---
+Cadrer les contrats backend et runtime pour: lister les projets IdeA avec contexte; lister les agents contactables d’un projet avec contexte; contacter un agent via projectId + agentId + message; lancer/reattacher un agent dans un projet fermé; réconcilier l’état lorsque le projet est ouvert ensuite; gérer busy/cancel/rendez-vous et routage de réponse vers le bon demandeur; éviter toute ambiguïté d’agents homonymes.
\ No newline at end of file
diff --git a/.ideai/tickets/263/carnet.md b/.ideai/tickets/263/carnet.md
new file mode 100644
index 00000000..f87b5b9d
--- /dev/null
+++ b/.ideai/tickets/263/carnet.md
@@ -0,0 +1,29 @@
+---
+issueRef: "#263"
+version: 14
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788792738864
+---
+# Carnet #263
+
+Contexte implementation backend issu de #262:
+- Identite canonique cross-project: `CrossProjectAgentRef { projectId, agentId }`; ne jamais router par nom.
+- Tools MCP additifs: `idea_project_list`, `idea_project_read_context`, `idea_project_list_agents`, `idea_project_ask_agent`, `idea_project_cancel_agent`.
+- Runtime target et busy/cancel indexes par `RuntimeAgentKey(projectId, agentId)`.
+- Permissions: agent contactable cross-project par projet, templates avec default materialise a la creation d'agent.
+
+Git:
+- Lot initial committe par Git: `9895498` sur `feature/260-backend`, merge root `530ce01` dans `feature/260-cross-project-agents`.
+
+Corrections QA:
+- Homonymes ask/cancel: `crates/application/src/orchestrator/service.rs` route via l'Agent resolu par `agentId`, sans repasser par nom; `idea_project_cancel_agent` stoppe via `agentId`.
+- App-tauri fixture: `crates/app-tauri/src/templates.rs` corrige `with_metadata(...)` avec `default_contactable`.
+- Provider template update: `crates/domain/src/template.rs` serialise toujours `default_contactable`, y compris `false`, pour renvoyer `defaultContactable: false` au lieu de Null.
+
+Tests verts connus:
+- `cargo test -p application cross_project_ --test orchestrator_service -- --nocapture` (5 passed)
+- `cargo test -p app-tauri --test dto_templates -- --nocapture` (22 passed)
+- `cargo test -p app-tauri template_provider_crud_round_trips_and_update_publishes_event -- --nocapture` (1 passed)
+- `cargo fmt --check`
+- `cargo check -p application -p infrastructure -p backend -p app-tauri --lib`
+- `cargo check -p domain -p app-tauri --lib`
\ No newline at end of file
diff --git a/.ideai/tickets/263/issue.md b/.ideai/tickets/263/issue.md
new file mode 100644
index 00000000..bfd03124
--- /dev/null
+++ b/.ideai/tickets/263/issue.md
@@ -0,0 +1,17 @@
+---
+id: "b31676b7-ca52-4273-b00d-c0c46cb6c8ba"
+number: 263
+title: "Cross-project agents: implémentation backend MCP et runtime"
+status: "closed"
+priority: "critical"
+sprint: null
+links: [{"target":"#260","kind":"dependsOn"}]
+agentRefs: [{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}]
+attachments: []
+createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+createdAt: 1788773730400
+updatedAt: 1788792738864
+version: 14
+---
+Implémenter les tools MCP cross-project et la mécanique runtime validée par Architect: discovery projets/contextes, discovery agents contactables/contextes, contact agent cross-project, permission persistée, launch projet fermé, reconciliation à l’ouverture, routage project-scopé, busy/cancel. Inclure tests backend ciblés.
\ No newline at end of file
diff --git a/.ideai/tickets/264/carnet.md b/.ideai/tickets/264/carnet.md
new file mode 100644
index 00000000..54cbd4b0
--- /dev/null
+++ b/.ideai/tickets/264/carnet.md
@@ -0,0 +1,25 @@
+---
+issueRef: "#264"
+version: 8
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788792738961
+---
+# Carnet #264
+
+Contexte UI issu de #261:
+
+- Ajouter dans section `Permissions` agent une checkbox `Contactable depuis d’autres projets`.
+- Texte aide agent: `Autorise les agents d’autres projets IdeA à solliciter cet agent via l’orchestration inter-projets. L’agent reste soumis à ses permissions et à son contexte.`
+- Dans editeur de template agent, meme checkbox; texte aide template: `Les agents créés avec ce template reprendront cette permission.`
+- Defaut decoche pour valeurs absentes/anciens templates/nouveaux agents.
+- Creation depuis template: copier la valeur du template; modifier un template ne change pas retroactivement les agents existants.
+- Erreur sauvegarde: `La permission n’a pas pu être enregistrée. Réessayez.`
+- Lecture impossible: permission decochee visuellement desactivee avec `Permission indisponible pour le moment.`
+
+Git:
+- Worktree frontend dedie: `/home/anthony/Documents/Projects/IdeA/.ideai/run/8f7da528-58df-4315-97e9-0562230ecc19/worktree` sur branche `feature/260-frontend`, propre apres stash Git `pre-260 leftovers frontend`.
+
+Blocage:
+- Les tours DevFrontend echouent avant generation avec erreur Codex 400: `gpt-5.6` non supporte.
+- Cause source: profil global `e9c0b04e-6506-498e-8a4a-f3713b87583d` dans `/home/anthony/.local/share/app.idea.ide/profiles.json` reste `model: gpt-5.6`.
+- Pas de diff frontend produit pour #264.
\ No newline at end of file
diff --git a/.ideai/tickets/264/issue.md b/.ideai/tickets/264/issue.md
new file mode 100644
index 00000000..8ff095c4
--- /dev/null
+++ b/.ideai/tickets/264/issue.md
@@ -0,0 +1,17 @@
+---
+id: "f9559bb0-47d4-43ef-99ce-1d81b9b8f5de"
+number: 264
+title: "Cross-project agents: UI permissions agents et templates"
+status: "closed"
+priority: "high"
+sprint: null
+links: [{"target":"#260","kind":"dependsOn"}]
+agentRefs: [{"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"}
+createdAt: 1788773730439
+updatedAt: 1788792738961
+version: 8
+---
+Implémenter la surface frontend validée par UX et les contrats fournis par Architect/DevBackend pour la permission contactable depuis d’autres projets, sur agents et templates. Inclure tests frontend ciblés.
\ No newline at end of file
diff --git a/.ideai/tickets/265/carnet.md b/.ideai/tickets/265/carnet.md
new file mode 100644
index 00000000..c46efe32
--- /dev/null
+++ b/.ideai/tickets/265/carnet.md
@@ -0,0 +1,28 @@
+---
+issueRef: "#265"
+version: 5
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedAt: 1788792738991
+---
+# Carnet #265
+
+QA finale sur `feature/260-cross-project-agents`: VERT.
+
+Commandes QA vertes:
+- `cargo test -p application cross_project_ --test orchestrator_service -- --nocapture`: 5 passed, incluant homonymes ask/cancel et filtre contactable.
+- `cargo test -p app-tauri --test dto_templates -- --nocapture`: 22 passed.
+- `cargo test -p app-tauri template_provider_crud_round_trips_and_update_publishes_event -- --nocapture`: 1 passed.
+- `cargo test -p infrastructure project_tool -- --nocapture`: 4 passed.
+- `cargo test -p infrastructure --test mcp_server tools_list_advertises_the_idea_tools_with_schemas -- --nocapture`: 1 passed.
+- `npm run typecheck`: vert.
+- `npm test -- src/features/permissions/permissions.test.tsx src/features/templates/templates.test.tsx src/features/workstate/workstate.test.tsx src/adapters/http/httpInvoker.test.ts`: 4 files passed, 71 tests passed.
+- `cargo fmt --check`: exit 0.
+
+Rouges corriges:
+- Homonymes `idea_project_ask_agent` / `idea_project_cancel_agent` ne reroutent plus par nom apres resolution UUID.
+- `dto_templates` app-tauri adapte a `default_contactable`.
+- `idea_template_update` provider retourne `defaultContactable: false` au lieu de Null.
+
+Gap/risque accepte: pas de test reel multi-process/projet ferme/reconciliation; validation par tests Rust cibles, fakes applicatifs, catalogue MCP, DTO/provider template et UI frontend.
+
+Etape suivante: Git commit/merge local puis build AppImage.
\ No newline at end of file
diff --git a/.ideai/tickets/265/issue.md b/.ideai/tickets/265/issue.md
new file mode 100644
index 00000000..658ea415
--- /dev/null
+++ b/.ideai/tickets/265/issue.md
@@ -0,0 +1,17 @@
+---
+id: "e7e283b0-e774-415f-8260-ac649dc38a32"
+number: 265
+title: "Cross-project agents: validation QA complète et AppImage"
+status: "inProgress"
+priority: "critical"
+sprint: null
+links: [{"target":"#260","kind":"dependsOn"}]
+agentRefs: [{"agentId":"ab328d90-c307-4771-a3b6-6c56089c8506","role":"assigned"}]
+attachments: []
+createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
+createdAt: 1788773730479
+updatedAt: 1788792738991
+version: 5
+---
+Valider la feature cross-project de bout en bout: tools MCP de discovery, agents contactables, contact cross-project avec projets fermés/ouverts, homonymes, busy/cancel/routage réponse, persistence permissions agents/templates, réconciliation à l’ouverture d’un projet. Puis valider le build AppImage produit.
\ No newline at end of file
diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json
index b671ae42..78649f54 100644
--- a/.ideai/tickets/counter.json
+++ b/.ideai/tickets/counter.json
@@ -1,3 +1,3 @@
{
- "nextNumber": 260
+ "nextNumber": 266
}
\ No newline at end of file
diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json
index 95fe0eb7..f15bf712 100644
--- a/.ideai/tickets/index.json
+++ b/.ideai/tickets/index.json
@@ -1487,7 +1487,7 @@
"issueRef": "#117",
"path": "117",
"title": "Garantir la synchronie métier de idea_ask_agent malgré les background tasks",
- "status": "inProgress",
+ "status": "closed",
"priority": "critical",
"sprint": null,
"assignedAgentIds": [
@@ -1496,7 +1496,7 @@
"createdBy": {
"kind": "user"
},
- "updatedAt": 1787336067149
+ "updatedAt": 1788789622644
},
{
"issueRef": "#119",
@@ -2025,7 +2025,7 @@
"issueRef": "#155",
"path": "155",
"title": "Custom chat: paste image/fichier depuis le clipboard dans le composer",
- "status": "inProgress",
+ "status": "closed",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
@@ -2036,7 +2036,7 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
- "updatedAt": 1786346556578
+ "updatedAt": 1788789622554
},
{
"issueRef": "#156",
@@ -2483,7 +2483,7 @@
"issueRef": "#185",
"path": "185",
"title": "Codex structured sandbox: rétablir l'écriture du project root pour les agents Dev sans perdre l'accès à .git",
- "status": "inProgress",
+ "status": "closed",
"priority": "critical",
"sprint": null,
"assignedAgentIds": [
@@ -2494,7 +2494,7 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
- "updatedAt": 1786709806993
+ "updatedAt": 1788789622659
},
{
"issueRef": "#186",
@@ -2632,7 +2632,7 @@
"issueRef": "#196",
"path": "196",
"title": "Permissions page grants do not allow agent write access to project root",
- "status": "inProgress",
+ "status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
@@ -2640,7 +2640,7 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
- "updatedAt": 1786709807009
+ "updatedAt": 1788789622674
},
{
"issueRef": "#197",
@@ -3279,7 +3279,7 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
- "updatedAt": 1787476334103
+ "updatedAt": 1788439323308
},
{
"issueRef": "#244",
@@ -3497,7 +3497,7 @@
"issueRef": "#259",
"path": "259",
"title": "Template permissions do not persist after save",
- "status": "qa",
+ "status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
@@ -3505,7 +3505,103 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
- "updatedAt": 1788438656514
+ "updatedAt": 1788438757480
+ },
+ {
+ "issueRef": "#260",
+ "path": "260",
+ "title": "Agents cross-project: MCP discovery, permissions et contact inter-projets",
+ "status": "inProgress",
+ "priority": "critical",
+ "sprint": null,
+ "assignedAgentIds": [
+ "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788791628015
+ },
+ {
+ "issueRef": "#261",
+ "path": "261",
+ "title": "Cross-project agents: cadrage UX permission agent/template",
+ "status": "closed",
+ "priority": "high",
+ "sprint": null,
+ "assignedAgentIds": [
+ "757430bb-014a-40fa-b82b-f2429dab9766"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788774465904
+ },
+ {
+ "issueRef": "#262",
+ "path": "262",
+ "title": "Cross-project agents: architecture MCP, registry projets et rendez-vous",
+ "status": "closed",
+ "priority": "critical",
+ "sprint": null,
+ "assignedAgentIds": [
+ "b4730d7f-c54d-4736-8a04-c6203aa2fd49"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788774465928
+ },
+ {
+ "issueRef": "#263",
+ "path": "263",
+ "title": "Cross-project agents: implémentation backend MCP et runtime",
+ "status": "closed",
+ "priority": "critical",
+ "sprint": null,
+ "assignedAgentIds": [
+ "fe887179-933f-47d4-960f-c3b06827f86c"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788792738864
+ },
+ {
+ "issueRef": "#264",
+ "path": "264",
+ "title": "Cross-project agents: UI permissions agents et templates",
+ "status": "closed",
+ "priority": "high",
+ "sprint": null,
+ "assignedAgentIds": [
+ "8f7da528-58df-4315-97e9-0562230ecc19"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788792738961
+ },
+ {
+ "issueRef": "#265",
+ "path": "265",
+ "title": "Cross-project agents: validation QA complète et AppImage",
+ "status": "inProgress",
+ "priority": "critical",
+ "sprint": null,
+ "assignedAgentIds": [
+ "ab328d90-c307-4771-a3b6-6c56089c8506"
+ ],
+ "createdBy": {
+ "kind": "agent",
+ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
+ },
+ "updatedAt": 1788792738991
}
]
}
\ No newline at end of file
diff --git a/crates/app-tauri/src/commands.rs b/crates/app-tauri/src/commands.rs
index 486dfd52..f805fb0c 100644
--- a/crates/app-tauri/src/commands.rs
+++ b/crates/app-tauri/src/commands.rs
@@ -540,6 +540,7 @@ mod open_project_template_tests {
default_agent_name: None,
default_system_permissions: None,
default_mcp_tool_policy: None,
+ default_contactable: false,
})
.await
.expect("template is created")
diff --git a/crates/app-tauri/src/templates.rs b/crates/app-tauri/src/templates.rs
index fbd18023..94229664 100644
--- a/crates/app-tauri/src/templates.rs
+++ b/crates/app-tauri/src/templates.rs
@@ -78,6 +78,8 @@ impl TemplateToolProvider for AppTemplateToolProvider {
"defaultMcpToolPermissions",
"defaultMcpToolPolicy",
)?,
+ default_contactable: optional_bool(&arguments, "defaultContactable")?
+ .unwrap_or(false),
})
.await
.map_err(template_error)?;
@@ -160,6 +162,17 @@ fn optional_string<'a>(
}
}
+fn optional_bool(value: &Value, key: &str) -> Result