Files
IdeA/.ideai/memory/feature-agent-skill-awareness-design.md
Blomios a1078503bc docs(skill-awareness): note de design feature-agent-skill-awareness
Récupère la seule note de design de la branche feature/agent-skill-awareness
(5be8987), hors bruit runtime .ideai. Documente la conception du manifeste de
skills, de l'outil MCP idea_skill_read et du brief « capacités IdeA ».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 18:30:47 +02:00

6.7 KiB

name, description, metadata
name description metadata
feature-agent-skill-awareness-design Design valide + decoupage de la feature « surfacer les skills assignes a un agent a la maniere MCP » (manifeste + idea_skill_read), a reprendre apres relance IdeA.
type
project

Feature : skills connus de l'agent « a la MCP »

Demarree le 2026-06-17. Branche Git feature/agent-skill-awareness (basee sur develop @ 8452333, qui contient deja le fix context-guard).

ETAT 2026-06-17 (apres-midi) : slice backend T1->T5 FAIT, VERT, COMMITTE.

DevBackend a livre T1->T5, QA a couvert (23 tests, 1212 passed). Commits sur feature/agent-skill-awareness :

  • ab34363 feat(skill-awareness): T1->T5 (manifeste # Skills disponibles + outil MCP idea_skill_read, description+effective_description, use case ReadSkill, cablage state.rs, dump legacy conserve en mode sans-MCP).
  • 1a10d67 fix(test): compteur d'outils MCP 11->12 (une 2e assertion codee en dur dans crates/app-tauri/src/state.rs ~l.2813 que QA avait ratee ; QA n'avait corrige que infrastructure/tests/mcp_server.rs).
  • e93a2c1 = cherry-pick du fix cold-start (cf. Bug 8 dans mcp-bridge-and-delegation-runtime-notes) — present aussi sur la branche dediee. cargo test --workspace VERT sur l'arbre combine. L'orchestrateur a committe lui-meme (l'agent Git etait injoignable a cause du Bug 8) — A FAIRE RELIRE/REBASER PAR GIT une fois le canal restaure.

RESTE : T6 (champ description dans creation/edition skill cote front) + T7 (e2e : rebuild AppImage avec le fix Bug 8, relance, agent neuf + skill assigne -> voit le manifeste + appelle idea_skill_read). Puis Git decide les merges (feature->develop ; fix cold-start->develop+main).

AJOUT 2026-06-17 (soir) : brief « capacites IdeA » INCONDITIONNEL — VERT, COMMITTE (566bff4)

Besoin utilisateur elargi : un agent neuf ignorait TOUT le perimetre IdeA (pas que les skills). Cas vecu : « agremente le contexte du projet » -> l'agent reinvente son propre systeme de contexte car le bloc # Orchestration IdeA ne parlait QUE de delegation. Fix (GO Architect, meme fonction pure compose_convention_file lifecycle.rs, zero port/entite) : ajout d'un brief « capacites IdeA » TOUJOURS present (decrit la CAPACITE, jamais le contenu -> survit a memoire/contexte vides), dans les 2 surfaces, AVANT le persona :

  • mode MCP : nomme les outils contexte (idea_context_read/idea_context_propose avec semantique single-writer global HONNETE : proposition sans target = enregistree pour validation, PAS appliquee ; idea_update_context pour le .md d'un agent), memoire partagee (idea_memory_read/idea_memory_write), skills (idea_skill_read/idea_create_skill). Martele « le contexte projet d'IdeA EST le contexte, n'improvise jamais ton propre fichier ».
  • mode non-MCP : MEMES concepts via fichiers .ideai/ UNIQUEMENT (CONTEXT.md, memory/+MEMORY.md, skills .md), AUCUN nom d'outil idea_* (cloisonnement strict des 2 surfaces — sinon casse mcp_prose_*/non_mcp_prose_*). QA : 5 tests dedies (brief inconditionnel des 3 capacites a zero contenu ; single-writer honnete ; non-MCP sans outil ; cloisonnement ; ordre avant persona). cargo test -p application = 0 failed (lib 52, agent_lifecycle 59). 1 assert existant adapte (mcp_mode_without_skills_omits_section). Commit atomique 566bff4 sur feature/agent-skill-awareness (Git a laisse les .ideai/ runtime hors commit). Merge feature->develop differe par Git jusqu'a T6+T7 (unite d'integration unique).

Historique

Cycle initialement stoppe avant le code : la delegation MCP a wedge (Bug 7, puis Bug 8 residuel cf. mcp-bridge-and-delegation-runtime-notes).

Besoin

Un agent neuf dans un projet neuf ignore les skills qui lui sont assignes (cas vecu : build-appimage assigne mais ignore, tout reinvente). Objectif : l'agent est automatiquement au courant de ses skills, comme il l'est des outils MCP, sans que l'utilisateur ait a le lui dire.

Decision produit (utilisateur, 2026-06-17) : approche « Manifeste + idea_skill_read »

Diagnostic Architect : les skills sont DEJA injectes, mais (A) en VRAC (corps complet) en fin de CLAUDE.md -> lus comme de la doc, ignores ; (B) seulement au (re)lancement. On recadre « a la MCP » : affordances nommees+decrites en tete de contexte + chargement du corps a la demande.

  • Bloc « # Skills disponibles » injecte JUSTE APRES le bloc « # Orchestration IdeA » (haute altitude), listant **<name>** — <description> ; prose imperative + renvoi a idea_skill_read(name=…). Omis si zero skill.
  • Nouvel outil MCP idea_skill_read(name) read-only, miroir exact de idea_context_read/idea_memory_read ; resout par nom (scope projet puis global), renvoie content_md inline ; erreur typee si introuvable/ambigu.
  • Champ description: Option<String> sur l'entite Skill + helper effective_description() (fallback : 1ere ligne non vide du content_md, nettoyee du #). #[serde(default)] sur l'index (retro-compat index.json legacy obligatoire).
  • Mode sans MCP (profile.mcp absent) : conserver l'ancien dump du corps complet (decision 4.2(b), zero regression).

Decoupage (commits atomiques par tache verte, decides par Git)

  • T1 domaine crates/domain/src/skill.rs : champ description + effective_description().
  • T2 store crates/infrastructure/src/store/skill.rs (+ application/skill) : description dans IndexEntry (serde(default)), propage via CreateSkill.
  • T3 convention-file crates/application/src/agent/lifecycle.rs : section « # Skills disponibles » dans compose_convention_file (~l.2568, juste apres bloc Orchestration ~l.2586) ; alleger resolve_skills (~l.1202) pour n'utiliser que name+description (index, pas le corps) ; garder dump corps si non-MCP.
  • T4 outil MCP crates/infrastructure/src/orchestrator/mcp/tools.rs + commande OrchestratorCommand::ReadSkill { name, requester } + methode read_skill dans OrchestratorService + petit use case ReadSkill (compose le port SkillStore existant, AUCUN nouveau port).
  • T5 cablage crates/app-tauri/src/state.rs : injecter ReadSkill dans OrchestratorService (builder additif, comme le fix context-guard) + re-exports application (orchestrator/mod.rs + lib.rs).
  • T6 front (differable) frontend : champ description dans creation/edition de skill.
  • T7 e2e : rebuild AppImage + relance, agent neuf + skill assigne -> voit le manifeste + appelle idea_skill_read.

Pieges (Architect)

Retro-compat index.json (serde default) ; resolution de nom ambigue (projet d'abord, erreur typee sinon) ; un skill assigne en cours de session reste invisible jusqu'au relaunch (limite inherente, comme MCP) ; pas de nouveau port, domaine = +1 champ, composition root seul point de cablage. GO Architect.