Capitalise la mémoire projet produite pendant la campagne de tests fonctionnels MCP (rendez-vous inter-agents, backstop no-reply, réconciliation live-state au reboot) et synchronise l'état runtime `.ideai/` (agents, layouts, skills, index mémoire). Inclut la mise à jour du contexte de l'agent Git. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.0 KiB
5.0 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| mcp-functional-test-plan-2026-06-24 | memory note mcp-functional-test-plan-2026-06-24 |
|
Plan de test fonctionnel MCP inter-agents (2026-06-24, run a6ced819)
Objectif : état des lieux par tests fonctionnels (pas unitaires) du rendez-vous idea_ask_agent ⇄ idea_reply, du trivial au plus tordu. On lance dans l'ordre, on s'arrête au 1er blocage, on corrige (cycle Architect→Git→Dev→QA), rebuild+relance, puis on reprend de T1. Contexte/historique : mcp-e2e-findings-reply-wedge-phantom-busy, backstop-fires-on-intra-task-turn-rootcause, rendezvous-no-reply-backstop-design, rendezvous-600s-cap-too-short-heavy-tasks, reconcile-live-state-implemented-feature-branch.
Contexte binaire au moment du plan
- AppImage qui tournait = build 23/06 19:42, PÉRIMÉ (antérieur à
c6f0f86encode_cwd,744de20backstop no-reply,886bb0d/1efe2f1reconcile). Décision utilisateur : rebuild develop HEAD1efe2f1puis relance avant de tester. - Règle structurelle : binaire qui tourne = AppImage. Tout fix backend ⇒ rebuild + relance d'IdeA (tue Main). Les tests s'enchaînent SANS relance à l'intérieur d'une même version ; chaque cycle de fix = 1 relance.
Méthode
- Main est le demandeur (
idea_ask_agent) = test fidèle de « si je donne un message à un agent, il me répond ». - Doublé d'observation externe Bash : ponts
ss -xp | grep idea-mcpetpgrep -af mcp-server; transcripts~/.claude/projects/<run-dir-encodé>/*.jsonl(horodatages UTC ; reply réel =tool_useidea_reply→tool_resultreply … delivered; wedge demandeur = transcript figé surtool_useidea_ask_agent sans tool_result) ; live-state viaidea_workstate_read. - Risque résiduel : un wedge non borné fige le tour de Main → l'utilisateur peut interrompre.
Setup IdeA à mettre en place avant T1 (consigne utilisateur)
- Relancer IdeA, ouvrir le projet IdeA, Main visible (le demandeur).
- Garder 2–3 cellules libres visibles pour qu'on observe à l'œil les délégations (Main y placera des cibles visibles, ou lance-toi QA + DevFrontend dans des cellules visibles).
- Laisser Architect, DevBackend, Git ARRÊTÉS (froids) : T3 testera le réveil à froid ; T9 utilisera Architect+DevBackend froids.
- Cibles chaudes pour T1/T2 : Main les réchauffe lui-même (launch) — pas d'action requise.
Ordre des tests (trivial → tordu)
- T1 — Visibilité outils MCP. Un agent lancé par IdeA voit ses outils sans action manuelle. Vérif : pont ESTAB (
ss) + 2 process mcp-server par requester. - T2 — Cible CHAUDE + idea_reply trivial. Main→ask(agent chaud, « réponds pong via idea_reply »). Attendu : réponse inline
pong, temps borné, workstate working→done purgé. - T3 — Réveil à FROID + idea_reply. Cible arrêtée. Attendu : pont relancé (nouveau mcp-server), 1er tour non perdu (1er user
[IdeA · tâche…]intact), reply remonte. - T4 — Cible BACKGROUND (node_id None). Délégation vers agent sans cellule visible. Attendu : même protocole, pas de 1er tour perdu (historiquement non testé).
- T5 — NO-REPLY (cible répond en prose, pas d'idea_reply). Attendu backstop : demandeur libéré en temps borné avec
TargetReturnedNoReply(retryable), pas de Busy fantôme (workstate purgé). DÉFAUT historique #1. - T6 — Délégation MULTI-ÉTAPES puis idea_reply. Cible lit plusieurs fichiers / lance une cmd PUIS idea_reply. Attendu : pas de libération prématurée pendant le travail, rapport final livré. PIÈGE turn-watcher (cause racine : backstop tirait au 1er tour interne ~3 s).
- T7 — Tâche LOURDE > plafond (impl +
cargo test/clippy). Attendu : extension sur signe de vie OU message clair « cible active, plafond atteint » (≠ faux-32001) ; idea_reply tardif non perdu. PlafondIDEA_ASK_RENDEZVOUS_TIMEOUT_MS(défaut 600000). - T8 — Délégations PARALLÈLES (2 cibles en 1 tour Main). Attendu : rendez-vous multiples simultanés OK, multiplexage pont, 2 réponses distinctes.
- T9 — TRANSITIVE A→B→C (Main→Architect, Architect délègue à DevBackend puis reply à Main). Attendu : rendez-vous imbriqués, 2 attentes simultanées sans deadlock. Cas le plus tordu.
- T10 — INTERRUPTION/annulation + reconcile reboot. (a) Main interrompt un ask en vol →
workingcible purgé, pas de cascade, idea_reply tardif non-livrable proprement. (b) Au reboot, orphelins status∈{working,waiting,blocked} & session morte →idle+ markerSTALE_AT_RESTART_MARKER(use case ReconcileLiveState, cf. reconcile-live-state-implemented-feature-branch).
Critère de fin
Tous les T1→T10 verts avec preuve réelle (réponse inline + observation externe cohérente). Sinon : 1er rouge = blocage à corriger, puis reprise de T1.