# Proposition - Passer d'un agent unique à une équipe d'agents > Réflexion inspirée de l'article [The Collaboration Gap](https://robotscooking.substack.com/p/the-collaboration-gap) (Adam Hyde, 2026) appliquée à `collab-editor`. ## 1. Constat sur l'état actuel Le `collab-editor` est aujourd'hui structuré autour de **deux agents isolés** : | Agent | Fichier | Rôle | |---|---|---| | Article agent | `backend/src/agent/chat.ts` + `frontend/src/hooks/useAgentChat.ts` | Édite le TipTap doc via `applyDiff` / `replaceSelection` / `insertAtCursor` | | Embed agent | `backend/src/agent/embed-chat.ts` + `frontend/src/hooks/useEmbedChat.ts` | Génère les embeds D3 | Les deux ne se parlent pas. Ils ne partagent pas de contexte. L'utilisateur est le seul "orchestrateur", à la main, en switchant d'interface. C'est exactement le pattern "one human, one AI, one task" que l'article pointe comme limitant. ## 2. Ce qu'on a déjà gratuitement (et que la plupart des setups multi-agents n'ont pas) | Brique | Fichier | Pourquoi c'est un atout | |---|---|---| | État partagé versionné (CRDT) | Y.js + Hocuspocus | C'est LE "shared board" de l'article, déjà construit, déjà résolveur de conflits | | Canal de messages ancrés | `frontend/src/editor/comments.ts` + `CommentsSidebar.tsx` | Communication latérale entre agents, visible par l'humain | | Undo groupé par tour | `UndoManager` + `startAgentBatch` | Rollback atomique d'une action d'équipe | | Tool calls structurés | `backend/src/agent/tools.ts` | Protocole déjà formalisé | | Frontmatter store réactif | `frontend/src/editor/frontmatter/frontmatter-store.ts` | État structuré séparé du corps, parfait pour un agent dédié | **Traduction** : on est mieux placés que Pure.Science pour implémenter ce que décrit Adam Hyde, parce que notre "bubble" existe déjà côté humain. ## 3. Proposition d'architecture - 5 rôles Inspirée directement de Pure.Science (Wax, Ketty, Coco, Paige, Koda), mais adaptée à l'écriture scientifique web-native. ### 3.1. Rôles | Agent | Rôle | Outils autorisés | Zones d'écriture | |---|---|---|---| | **Scout** | Topic Strategist : cadre le papier, propose l'angle | `setFrontmatterDraft`, `proposeOutline` (commentaire) | Commentaires uniquement | | **Archi** | Outliner / Structurer : gère TOC, hiérarchie, sections | `applyDiff` sur headings, `insertSection` | Headings, structure | | **Scribe** | Writer : rédige les paragraphes | `applyDiff`, `insertAtCursor` | Corps du texte | | **Biblio** | Literature Retriever : cherche des refs, pose des citations | `addCitation`, `addBibEntry`, `commentSuggestion` | Bibliography.bib + balises `[@key]` | | **Critic** | QA / Reviewer : relit, pointe incohérences, passe des commentaires | `comment`, `resolveComment`, `flagInconsistency` | Commentaires uniquement (read-only sur le doc) | **Point crucial** : seuls `Archi` et `Scribe` touchent au texte. `Critic` **ne peut pas éditer**, il commente - ça force la friction que décrit l'article et évite le "yes-man loop" des LLMs. ### 3.2. Orchestrateur Un agent léger côté backend (nouveau fichier `backend/src/agent/orchestrator.ts`) qui : 1. Reçoit le message de l'humain 2. Lit l'état du doc (+ frontmatter + commentaires ouverts) 3. Décide quel(s) agent(s) réveiller et dans quel ordre 4. Tient un journal de tâches visible (équivalent du "board" dans l'article) L'orchestrateur n'édite jamais. Il **dispatche** et **attend**. Comme le facilitateur d'un Book Sprint. ### 3.3. Code de conduite partagé Un prompt-système commun (nouveau `backend/src/agent/team-code-of-conduct.ts`) injecté dans **tous** les agents : ```md 1. Avant toute action, lis le board (commentaires ouverts + journal orchestrateur). 2. Reste dans ton rôle. Si une tâche sort de ton périmètre, ping l'agent compétent via un commentaire typé. 3. N'écrase pas le travail d'un autre agent sans laisser un commentaire justifiant le changement. 4. Les désaccords se résolvent par commentaire ancré, pas par écrasement silencieux. 5. Sois concis. Un message = une intention. ``` Directement dérivé du "code of conduct" Pure.Science. ## 4. Communication latérale - piggyback sur les commentaires Plutôt qu'un bus de messages séparé, on étend le système de commentaires existant avec un champ `author` et `audience` : ```ts interface AgentComment { author: "scout" | "archi" | "scribe" | "biblio" | "critic" | "human"; audience: Array<"scout" | "archi" | "scribe" | "biblio" | "critic" | "human">; kind: "suggestion" | "question" | "blocker" | "task"; anchor: { from: number; to: number }; body: string; } ``` Bénéfices : - L'humain voit **tout** dans la sidebar existante (`CommentsSidebar.tsx`) - Les agents s'adressent à un autre agent via `audience: ["scribe"]` - Rien à construire côté infra, juste étendre le schema ## 5. UI - rendre l'équipe visible L'article insiste sur le fait que **la valeur de la collab est invisible si on ne la montre pas**. Proposition côté UI : ### 5.1. Team activity timeline Un petit panneau dans `TopBar.tsx` ou sous le chat : ``` [Archi] → created section "Methodology" 2s ago [Biblio] → suggested 3 citations in §2 5s ago [Critic] → flagged: unsupported claim in §3 8s ago [Scribe] → drafted paragraph in §1 12s ago ``` ### 5.2. Curseurs colorés par agent On a déjà les curseurs multi-utilisateurs via `collaboration-cursor-v3.ts`. Chaque agent devient un "utilisateur virtuel" avec sa couleur et son nom de rôle. L'humain **voit en direct** où chaque agent travaille. Zero nouvelle infra. ### 5.3. Quick actions par rôle Remplacer le `sendQuickAction` générique de `useAgentChat.ts` par un sélecteur de rôle : ``` Ask [ Scribe ▾ ] to: [ rewrite this paragraph ] ``` ## 6. Plan d'implémentation progressif Par ordre de ROI, du plus petit au plus gros. ### Étape 1 - Split sémantique sans nouvelle infra (2-3j) - Spécialiser le prompt actuel : le SYSTEM prompt passe de "tu es un assistant qui édite" à "tu es le Scribe, tu écris les paragraphes". - Ajouter un prompt `Critic` qui ne fait QUE passer des commentaires (pas de tool d'édition). - UI : un dropdown "Talk to [ Scribe / Critic ]". Valeur : on valide l'hypothèse qu'un agent read-only qui commente améliore la qualité perçue, avant de construire l'orchestration. ### Étape 2 - Curseurs agents + timeline (2j) - Chaque agent = user Y.js virtuel avec couleur. - Timeline agrégée depuis les tool calls loggés. Valeur : rend la collaboration lisible, c'est le point central d'Adam Hyde. ### Étape 3 - Biblio agent autonome (3-4j) - Outils `addCitation`, `searchArxiv`, `addBibEntry`. - Déclenchement automatique quand `Scribe` écrit une affirmation factuelle (via tool `requestCitation`). Valeur : premier cas de communication latérale agent→agent concrète. ### Étape 4 - Orchestrateur (5-7j) - Nouveau route `/api/orchestrate` qui dispatche plutôt que de `/api/chat` directement. - Board visible dans le chat. Valeur : vrai multi-agent, mais seulement une fois les étapes 1-3 validées. ### Étape 5 - Scout (cadrage initial) (3j) - Agent qui intervient uniquement au début d'un nouveau doc, à partir d'un prompt court "je veux écrire sur X". - Génère frontmatter + TOC + commentaires de cadrage. Valeur : onboarding d'un nouvel article 10x plus fluide. ## 7. Métrique de succès Adam Hyde souligne qu'on ne sait pas benchmarker la collaboration. Proposition de 3 mesures simples et propres à l'éditeur : | Métrique | Comment | Pourquoi | |---|---|---| | **Commentaires résolus par session** | Compteur via le store de commentaires | Proxy de la qualité de la friction | | **Ratio d'édits rollback par l'humain** | Undo après action agent / total actions agent | Mesure l'alignement | | **Temps médian d'un article jusqu'à "publish"** | Log `published_at - created_at` côté backend | Mesure l'effet global | Pas de benchmark LLM abstrait : on mesure **sur le produit**. ## 8. Risques et limites - **Coût tokens ×N** : chaque tour peut réveiller 2-3 agents. À mitiger avec un routing intelligent côté orchestrateur (ne pas réveiller `Biblio` si le message est "fix grammaire"). - **LLMs d'accord avec tout** : le rôle `Critic` ne marche que si le prompt force la contradiction explicite. À itérer avec des exemples few-shot. - **UX du bruit** : si les 5 agents commentent en permanence, la sidebar devient illisible. Prévoir un mode "muet par défaut, opt-in par rôle". - **Complexité de debug** : logger impérativement le journal orchestrateur pour pouvoir rejouer une session. ## 9. Ce que ça apporte à ton produit Aujourd'hui `collab-editor` est "un Notion-like pour papiers scientifiques avec un AI assistant". C'est bien, mais une dizaine de produits font ça. Avec cette architecture, tu deviens **le premier éditeur scientifique où une équipe d'agents spécialisés co-écrit avec l'humain**, en s'appuyant sur l'infra temps-réel Y.js que tu as déjà. C'est une proposition produit claire et différenciante, directement alignée avec la thèse de l'article : > "Les organisations qui investissent dans l'architecture de collaboration avec le même sérieux qu'elles investissent dans la capacité des modèles produiront de meilleurs résultats." ## 10. Prochaine étape concrète suggérée Commencer par **l'étape 1** : forker `useAgentChat` en `useScribeChat` + `useCriticChat`, avec un simple toggle d'UI. C'est 2 jours de boulot, ça valide ou invalide l'hypothèse avant d'engager l'orchestrateur.