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.4 KiB
Skill — Test fonctionnel du rendez-vous inter-agents MCP
Workflow ré-exécutable et évolutif pour tester de bout en bout le rendez-vous idea_ask_agent ⇄ idea_reply d'IdeA, du trivial au plus tordu. À relancer après chaque rebuild qui touche l'orchestration MCP / le backstop / la live-state. Ce plan évolue : à chaque nouveau souci rencontré, ajoute/raffine un test Tn et note le défaut dans la section « Journal des défauts ».
Principe
- 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-mcp(ESTAB) etpgrep -af mcp-server(2 process par requester = pont vivant). - 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. 1er tour intact = 1re ligne userparentUuid:null=[IdeA · tâche…]. - placement :
.ideai/layouts.json(agent présent = cellule visible ; absent = background / node_id None). - live-state :
idea_workstate_read(last-writer-wins, pas temps réel).
- ponts :
- 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. Vérifier avant T1 :
statmtime de l'AppImage récent +git log -1= HEAD attendu.
Setup avant T1
- Relancer IdeA, ouvrir le projet, Main visible (le demandeur).
- Garder 2 cellules visibles libres + lancer QA et DevFrontend dans des cellules visibles (cibles chaudes).
- Laisser Architect, DevBackend, Git ARRÊTÉS (froids) : T3 teste le réveil à froid ; T9 utilise Architect+DevBackend froids.
Méthode d'exécution
On lance dans l'ordre, on note chaque verdict avec preuve réelle. Si un défaut bloquant apparaît : stop, ouvrir le cycle de fix (Architect→Git→DevBackend→QA, ou via subagents si le rendez-vous lui-même est cassé), rebuild + relance, puis reprise depuis T1. Un défaut non bloquant est consigné au Journal et on peut continuer si l'utilisateur le décide.
Ordre des tests (trivial → tordu)
- T1 — Visibilité outils MCP. Agent lancé par IdeA voit ses outils sans action manuelle. Vérif : pont ESTAB + 2 mcp-server par requester ; cibles froides = 0 process.
- T2 — Cible CHAUDE + idea_reply trivial. ask(agent chaud, « pong via idea_reply »). Attendu :
ponginline borné, workstatedone, pas de busy fantôme. - T3 — Réveil à FROID + idea_reply. Cible arrêtée. Attendu : pont relancé (nouveau mcp-server), 1er tour non perdu, reply remonte.
- T4 — Cible BACKGROUND (node_id None). Cible hors layout (sans cellule visible). Attendu : même protocole, multi-tours sans perte.
- T5 — NO-REPLY (cible répond en prose, pas d'idea_reply). Attendu : backstop libère le demandeur en temps borné avec
TargetReturnedNoReply(retryable), ET live-state de la cible purgée (pas de busy fantôme). 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 : 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, 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.
- 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 {working,waiting,blocked} & session morte →idle+STALE_AT_RESTART_MARKER(use case ReconcileLiveState).
Critère de fin
Tous les T1→T10 verts avec preuve réelle. Sinon : 1er défaut bloquant = corriger puis reprise T1.
Journal des défauts (à enrichir au fil des runs)
- 2026-06-24, run a6ced819 (AppImage 08:15, HEAD
1efe2f1) — T1→T4 ✅. T5 partiel : backstop libère le demandeur en ~24 s (TargetReturnedNoReplyretryable, wedge demandeur corrigé) MAIS la live-state de la cible n'est pas purgée : elle restestatus:"working"jusqu'au prochain write réussi de la cible (re-délégation non bloquée, busy fantôme atténué mais présent →idea_workstate_readment sur la dispo). Cause : backstop agit côté demandeur, ne réinitialise pas la live-state de la cible sur no-reply. → fix en cours.
Notes / pièges observés
- IdeA peut placer une cible réveillée en background même quand des cellules visibles sont libres (observé T3/T4).
- Quand le rendez-vous MCP lui-même est suspecté cassé, ne pas orchestrer le fix via
idea_ask_agent(risque de blocage) : utiliser les subagents natifs de l'orchestrateur pour analyse/fix/rebuild.