Files
IdeA/.ideai/tickets/276/carnet.md

142 lines
8.0 KiB
Markdown

---
issueRef: "#276"
version: 6
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788814093598
---
## Décision Git — 2026-09-07
- Arbitrage acté : `isOrchestrator` conservé comme rôle single-writer du contexte global, distinct des permissions MCP ; à exposer/configurer par agent (contrats + implémentation + surface UX + tests).
- Branche locale de travail : `feature/276-orchestrator-context-writer`, créée depuis `develop` @ ad2c6b4 (pointe intégrée, QA #269/#273 verte). Aucune branche parallèle backend/frontend nécessaire — périmètre modéré, branche unique.
- Changements préexistants transportés sur la branche (non commités) : bookkeeping du store `.ideai/` (permissions, tickets, memory) — Git les traitera dans un chore séparé au moment du commit.
- Point d'attention signalé à Main : `.ideai/CONTEXT.md` (contexte global) est non suivi et non gitignoré — décider en cours de cycle s'il doit être versionné ou exclu.
- Consigne devs : travailler directement sur `feature/276-orchestrator-context-writer`, ne pas créer de branche, ne pas commiter (Git s'en charge), aucune action distante.
## Handoff DevBackend — 2026-09-07
Implémentation backend présente dans le working tree :
- use case `UpdateProjectOrchestrator` : vérifie que l'agent appartient au projet, persiste sa désignation dans le manifeste, reste idempotent si le writer est déjà effectif, puis publie `DomainEvent::OrchestratorChanged` après succès de persistance ;
- câblage dans `BackendCore` et commande Tauri `update_project_orchestrator` enregistrée ;
- DTO wire camelCase : requête `{ projectId, agentId }`, réponse `{ orchestratorAgentId }` ;
- préservation de la désignation explicite lors des mutations d'agent, skills et templates ; suppression du writer explicite avec succession automatique vers le plus ancien agent restant ;
- message de refus de `idea_context_update` enrichi avec le writer courant et l'orientation vers `idea_context_propose` ; catalogue MCP clarifié : les permissions MCP ne confèrent pas le rôle de writer ;
- tests ciblés ajoutés pour désignation, agent inconnu, préservation lors d'une mutation, suppression/succession, message de refus et désérialisation DTO.
Fichiers volontairement modifiés :
- `crates/application/src/agent/lifecycle.rs`
- `crates/application/src/agent/mod.rs`
- `crates/application/src/lib.rs`
- `crates/application/src/orchestrator/context_guard.rs`
- `crates/application/src/skill/usecases.rs`
- `crates/application/src/template/usecases.rs`
- `crates/application/tests/agent_lifecycle.rs`
- `crates/backend/src/dto.rs`
- `crates/backend/src/lib.rs`
- `crates/app-tauri/src/commands.rs`
- `crates/app-tauri/src/lib.rs`
- `crates/app-tauri/tests/dto_agents.rs`
- `crates/domain/src/fileguard.rs`
- `crates/infrastructure/src/orchestrator/mcp/tools.rs`
Validation récupérable après timeout : `git diff --check` est vert. Aucun verdict Cargo complet n'est récupérable dans la session reprise ; ne pas considérer ce lot validé avant `cargo fmt --all --check`, les tests ciblés application/app-tauri/infrastructure, puis le check workspace par QA.
Contrat frontend : invoquer `update_project_orchestrator` avec `{ projectId: string, agentId: string }`; succès `{ orchestratorAgentId: string }`. Rafraîchir la liste des agents pour lire les indicateurs `isOrchestrator` effectifs (radio/single-writer).
## Handoff DevFrontend — 2026-09-07
Implémentation frontend livrée dans le working tree, sans commit ni action distante :
- `Agent.isOrchestrator` ajouté au DTO frontend et `AgentGateway.updateProjectOrchestrator(projectId, agentId)` ajouté au port ;
- adapters Tauri et HTTP branchés sur `update_project_orchestrator` avec le payload `{ request: { projectId, agentId } }` et la réponse `{ orchestratorAgentId }` ; mock gateway aligné sur l'exclusivité single-writer ;
- `useAgents.updateProjectOrchestrator` appelle le backend, rafraîchit ensuite `listAgents` et expose les erreurs via l'alerte existante ;
- dans la ligne sélectionnée de la fiche agent, section `Rôle dans le projet` avant les autres contrôles, radio `Writer du contexte projet global` et aide UX littérale ;
- badge sobre `Writer contexte` dans l'identité de l'agent effectif ;
- confirmation avant transfert lorsque la liste expose déjà un autre writer, avec noms de l'ancien et du nouveau writer ;
- aucun changement au panneau ni aux checkboxes de permissions MCP.
Fichiers frontend modifiés :
- `frontend/src/domain/index.ts`
- `frontend/src/ports/index.ts`
- `frontend/src/adapters/agent.ts`
- `frontend/src/adapters/http/streamGateways.ts`
- `frontend/src/adapters/mock/index.ts`
- `frontend/src/features/agents/useAgents.ts`
- `frontend/src/features/agents/AgentsPanel.tsx`
- `frontend/src/adapters/agent.test.ts`
- `frontend/src/adapters/http/agentGateway.test.ts`
- `frontend/src/features/agents/agents.test.tsx`
Validation exécutée :
- `cd frontend && npm test -- --run src/features/agents/agents.test.tsx src/adapters/agent.test.ts src/adapters/http/agentGateway.test.ts` — vert, 3 fichiers / 69 tests ; avertissement jsdom connu sur `HTMLCanvasElement.getContext`, sans échec.
- `cd frontend && npm run typecheck` — vert.
- `git diff --check` — vert.
Verdict DevFrontend : lot #276 implémenté et prêt pour validation QA. Aucun ajustement backend effectué.
## Verdict QA — 2026-09-07
Verdict QA officiel : VERT sur `feature/276-orchestrator-context-writer` @ `ad2c6b4`.
Inspection rapide : les diffs pertinents correspondent au périmètre annoncé : rôle `isOrchestrator` conservé comme writer single-writer distinct des permissions MCP, use case/commande/DTO/adapters ajoutés, garde `idea_context_update` clarifiée, UI agent avec section rôle/radio/badge/confirmation.
Commandes exécutées et résultats :
```bash
git -C /home/anthony/Documents/Projects/IdeA status --short --branch
# ## feature/276-orchestrator-context-writer
# worktree sale attendu : changements feature + bookkeeping .ideai/ non suivis/modifiés
git -C /home/anthony/Documents/Projects/IdeA rev-parse --short HEAD
# ad2c6b4
git -C /home/anthony/Documents/Projects/IdeA diff --check
# exit 0
cargo fmt --all --check
# exit 0
cargo test -p application --test agent_lifecycle orchestrator -- --nocapture
# 5 passed; 0 failed; 106 filtered out
cargo test -p application context_update -- --nocapture
# 1 passed; 0 failed; 165 filtered out
cargo test -p application --test skill_usecases -- --nocapture
# 9 passed; 0 failed
cargo test -p application --test template_usecases -- --nocapture
# 11 passed; 0 failed
cargo test -p app-tauri update_project_orchestrator -- --nocapture
# 1 passed; 0 failed; autres cibles filtrées
cargo test -p app-tauri --test dto_agents orchestrator -- --nocapture
# 1 passed; 0 failed; 29 filtered out
cargo test -p infrastructure tools -- --nocapture
# lib: 28 passed; 0 failed; mcp_server: 10 passed; 0 failed; autres cibles filtrées
cargo test -p infrastructure --test context_store orchestrator -- --nocapture
# 2 passed; 0 failed; 5 filtered out
cargo check -p backend -p app-tauri
# Finished dev profile successfully
cargo test -p backend --lib -- --nocapture
# 83 passed; 0 failed; 7 ignored
cd frontend && npm test -- --run src/features/agents/agents.test.tsx src/adapters/agent.test.ts src/adapters/http/agentGateway.test.ts
# Test Files 3 passed; Tests 69 passed
# Avertissement connu jsdom: HTMLCanvasElement.getContext non implémenté, sans échec
cd frontend && npm run typecheck
# tsc --noEmit OK
```
Commandes de ciblage non comptées comme validation : un essai `cargo test -p application --test orchestrator_context_guard ...` a échoué car cette cible n'existe pas ; un filtre `cargo test -p infrastructure --test mcp_server context_update ...` a sélectionné 0 test. Les validations utiles ci-dessus remplacent ces filtres.
Risques résiduels : pas de test manuel AppImage/runtime desktop exécuté ; validation limitée aux tests ciblés backend/frontend et au check de compilation. Les fichiers `.ideai/` et `scripts/` non suivis/modifiés restent à arbitrer par Git comme prévu dans le carnet.