# Orchestration Cluster — le vibe-coding à l'échelle d'une flotte

[← Vibe-Coding](../README.md) | [↑ docs](.) | [Topologie cluster](../../../../docs/reference/cluster-agents.md) | [Architecture MCP](../../../../docs/reference/architecture_mcp_roo.md)

Les ateliers [Claude Code](../Claude-Code/README.md) et [Roo Code](../Roo-Code/README.md) présentent le vibe-coding **à l'échelle d'une session** : un développeur, un IDE, un assistant qui écrit du code à la demande. Les [Claw Systems](../Claw-Systems/README.md) montrent des agents autonomes en conteneurs. Cette section documente la pièce la plus originale — et la moins visible — du harnais réellement utilisé pour produire ce dépôt : **l'orchestration d'une flotte d'agents de codage répartis sur plusieurs machines**, qui coordonnent leur travail, partagent une mémoire, et livrent du code sans intervention humaine continue.

Concrètement : la plupart des notebooks, preuves Lean, stratégies QuantConnect et corrections de ce dépôt ne sont pas écrits par un humain dans un IDE. Ils sont produits par un **cluster d'agents** (un coordinateur + plusieurs workers) qui tournent en cycles, se répartissent les tâches via des tableaux de bord partagés, et s'auto-alimentent dans un pool de tâches commun. C'est le vibe-coding poussé jusqu'à sa logique d'agentic engineering décrite par [Peter Steinberger](../Claw-Systems/docs/00-Philosophie-Agentic-Engineering.md) — non plus « je supervise un agent », mais « je supervise une flotte ».

## Pourquoi une section orchestration ?

| Aspect | Vibe-coding de session (Claude/Roo) | Orchestration cluster (cette section) |
|--------|-------------------------------------|----------------------------------------|
| **Échelle** | Un agent, une session, un humain présent | Une flotte d'agents, cycles persistants, humain distancié |
| **Mémoire** | Contexte de la session (volatile) | Mémoire sémantique persistante (Qdrant) + dashboards |
| **Coordination** | Aucune (agent unique) | Tableaux de bord partagés + messagerie inter-agents |
| **Répartition du travail** | L'humain donne la tâche | Les agents piochent dans un pool commun, se répartissent |
| **Vérification** | L'humain relit chaque sortie | Règles auto-chargées + relecture croisée agent ↔ agent |
| **Livrable** | Du code dans un fichier | Une PR mergée, sans action humaine directe |

Le saut n'est pas anecdotique. Passer d'un agent à une flotte change les problèmes : comment deux agents évitent-ils de travailler sur le même fichier ? comment un agent sait-il ce que les autres ont fait ? comment s'assurer qu'un agent n'affirme pas « fait » sans avoir vérifié ? Le harnais ci-dessous répond à ces questions avec un protocole de coordination explicite, pas avec de la confiance.

### Situation dans le parcours

Un atelier « découverte Claude Code » (module 01) apprend à démarrer une session, écrire un `CLAUDE.md`, utiliser les `@`-mentions. Le module 05 (Automatisation avancée) introduit skills, subagents et MCP **génériques** du marché. Cette section montre la **même composition poussée à l'échelle d'un cluster** : les `CLAUDE.md` deviennent un harnais de règles auto-chargées, les MCP génériques sont complétés par des MCP maison spécialisés, et la session unique devient un cycle coordonné parmi des dizaines. C'est le prolongement naturel des ateliers quand on veut automatiser non plus une tâche, mais tout un pipeline de développement continu.

## La brique centrale : `roo-state-manager` (RooSync)

`roo-state-manager` est un serveur MCP maison ([roo-extensions](https://github.com/jsboige/roo-extensions)) qui expose **15 outils** de coordination. C'est le **système nerveux** du cluster : tout agent qui s'y connecte peut lire l'état de la flotte, poster son avancement, chercher dans l'historique des conversations, et synchroniser sa configuration. Chaque outil porte plusieurs actions (`roosync_dashboard` couvre `read`/`write`/`append`/`list`/…), ce qui explique qu'un petit nombre d'outils suffise à une surface aussi large. Le détail outil par outil vit en amont, dans [HARNESS-OVERVIEW.md §2](https://github.com/jsboige/roo-extensions/blob/main/docs/harness/HARNESS-OVERVIEW.md) ; on les regroupe ici en cinq familles d'usage :

| Famille | Outils représentatifs | Rôle |
|---------|----------------------|------|
| **Dashboards** | `roosync_dashboard` | Trois tableaux de bord partagés — `global` (cluster), `machine` (un nœud), `workspace` (un projet) — où chaque agent poste début/livraison/fin de cycle. Canal principal de coordination ; auto-condensation à 92 % pour ne pas croître indéfiniment. |
| **Messagerie** | `roosync_messages` | Messages directs inter-machines (dispatch, ACK, escalade). Le canal de décision : survit à la condensation du dashboard, là où un simple « post » serait perdu. |
| **Mémoire conversationnelle** | `conversation_browser` | Navigation dans l'historique des sessions (`list` → `view`/`tree`/`summarize`). Un agent reprend le travail d'un autre en lisant sa trace, pas en devinant. |
| **Recherche sémantique** | `codebase_search`, `roosync_search` | Indexation Qdrant du code et des conversations. La « mémoire long-terme » : retrouver qu'un problème a déjà été résolu, et comment. |
| **Inventaire & config** | `roosync_inventory`, `roosync_config`, `roosync_baseline` | État du cluster (machines, GPUs, heartbeats) et synchronisation de configuration entre nœuds. |

Le principe directeur : **aucune mémoire n'est implicite**. Un agent qui démarre un cycle lit d'abord le dashboard (`section:"all"`) et sa boîte de messages, reconstruit l'état à partir de ces sources persistantes, puis agit. Ce qui n'est pas écrit dans le dashboard ou un fichier ne compte pas — le contexte de session est volatile et sera résumé puis perdu.

## Les MCPs maison spécialisés

Les ateliers Claude Code / Roo Code introduisent les MCP (Model Context Protocol) avec des serveurs **génériques** du marché — recherche web, automation navigateur, gestion de dépôt. C'est nécessaire pour démarrer, mais ça laisse dans l'ombre la partie la plus originale : **nos propres serveurs MCP**, écrits (dans [roo-extensions](https://github.com/jsboige/roo-extensions)) pour les besoins spécifiques du cluster. Autour de `roo-state-manager`, ces serveurs maison donnent aux agents des capacités concrètes au-delà du code :

| MCP | Capacité apportée (exemple d'usage réel dans ce dépôt) | Documentation pérenne |
|-----|--------------------------------------------------------|----------------------|
| **jupyter-papermill** | Exécuter des notebooks Jupyter (cycle de vie kernel complet) ; re-exécuter un notebook modifié et capturer ses sorties avant commit (règle C.2) | [kernels-runtime.md](../../../../docs/reference/kernels-runtime.md) |
| **qc-mcp-lite** | Pilote QuantConnect Cloud (compile, backtest, lecture résultats) ; lire Sharpe/CAGR/MaxDD et les reporter dans le commit | [quantconnect.md](../../../../docs/qc/quantconnect.md) |
| **sk-agent** | Vision + multi-agent (analyse d'images, agents spécialisés) ; audit visuel de galeries de figures README | [common-commands.md](../../../../docs/reference/common-commands.md) |
| **searxng** | Recherche web (SearXNG) ; veille techno, vérification de versions de librairies | [common-commands.md](../../../../docs/reference/common-commands.md) |
| **markitdown** | Conversion PDF/DOCX → Markdown ; extraction de contenu de slides ou de documents pédagogiques | [common-commands.md](../../../../docs/reference/common-commands.md) |
| **playwright** | Automation web (navigateur headless) ; exécution de quantbooks QC Cloud en fallback, tests E2E | [common-commands.md](../../../../docs/reference/common-commands.md) |

Ces serveurs tournent en `stdio` et sont gérés par le client MCP (cycle de vie, restart au changement de fichier source). Le diagnostic de leur démarrage est documenté dans [Architecture MCP](../../../../docs/reference/architecture_mcp_roo.md). L'intérêt pédagogique : chacun est un **vrai outil SOTA branché**, pas une simulation — un agent qui en a besoin l'invoque réellement, obtient sa vraie sortie, et la commet.

Ces serveurs sont déclarés dans `.mcp.json` (configuration de projet) et `~/.claude.json` (configuration globale). **Aucun secret n'est committé** : les jetons vivent dans `.secrets/master.env` (gitignoré), source unique propagée vers les `.env` consommateurs par [`scripts/secrets/render_envs.py`](../../../../scripts/secrets/render_envs.py) (cf. [secrets-management.md](../../../../docs/genai/secrets-management.md)). Cette discipline — secrets hors-du-repo, jamais de littéral inline — est l'un des garde-fous les plus répétés du harnais.

## Le pattern coordinateur / workers

La flotte adopte une topologie à deux rôles (détails complets dans [Topologie cluster](../../../../docs/reference/cluster-agents.md)) :

```text
                     ┌─────────────────────────────┐
                     │   ai-01  (coordinateur)     │
                     │   - lit les 2 dashboards    │
                     │   - merge les PR propres    │
                     │   - dispatche par DM        │
                     │   - tranche les arbitrages  │
                     └──────────────┬──────────────┘
                                    │  DM (dispatch / ACK / steer)
               ┌────────────────────┼────────────────────┐
               │                    │                    │
       ┌───────▼──────┐     ┌───────▼──────┐     ┌───────▼──────┐
       │  po-2023     │     │  po-2024     │     │  po-2026     │  ...
       │  (worker)    │     │  (worker)    │     │  (worker)    │
       │  GenAI/audio │     │  QC/ML train │     │  Lean/Mathlib│
       └──────────────┘     └──────────────┘     └──────────────┘
               │                    │                    │
               └────────────────────┴────────────────────┘
                                    │
                          pool commun : gh issue list --state open
```

- **`ai-01` (coordinateur)** : ne produit peu de code lui-même. Il lit l'état des deux lanes (`workspace-CoursIA`, `workspace-CoursIA-2`), merge les PR propres et approuvées (via bascule de compte GitHub), dispatche les tâches par message direct, et tranche les arbitrages de design. Un cycle `/coordinate` typique : lire → merger ce qui est mûr → dispatcher un grain vérifié firsthand → acker les bloqueurs.
- **`po-*` (workers)** : chacun spécialisé par famille (GenAI, QuantConnect/ML, Lean, etc.) mais le pool de travail est **commun et cross-lane**. Un worker se réveille sur un cycle `/continue`, lit le dashboard + sa boîte DM, pioche une tâche, livre une PR atomique, rapporte, puis re-pioche. Une lane est une étiquette de *reporting*, pas une frontière de travail.

### Anatomie d'un cycle worker (`/continue`)

Un worker ne dépend d'aucun état en mémoire vive — tout est reconstruit depuis des sources persistantes :

1. **Contexte** : lire `MEMORY.md`, `git pull --ff-only`, vérifier l'arbre partagé (worktree isolé si sale).
2. **Tour de coordination** : boîte de messages (`inbox status:unread`) **en premier**, puis dashboard (`section:"all"`). Les missions du coordinateur priment sur le travail local.
3. **Choix de la tâche** : P0 mission coord > P1 travail en cours > P2 pool global (`gh issue list --state open`). `[CLAIMED]` sur le dashboard **avant** de commencer (anti-double-claim).
4. **Livraison** : une PR = un sujet atomique. Commit + PR **avant** le rapport.
5. **Fin** : `[DONE]` lane-specific sur le dashboard. Une PR livrée ne clôt pas la session : on re-pioche aussitôt.

Le point clé : ce protocole est **auto-alimenté**. Un worker qui se réveille sans directive ne s'arrête pas — il pioche dans le pool et produit quand même. « Rien à faire » alors que `gh issue list` renvoie des dizaines d'issues est traité comme un échec de méthode, pas un état légitime.

## Les garde-fous : règles auto-chargées et relecture croisée

Une flotte sans discipline produit du travail à grande échelle… et des régressions à grande échelle. Le harnais encode ses garde-fous dans des **règles markdown auto-chargées** à chaque session (`.claude/rules/*.md` + `CLAUDE.md`), pas dans la bonne volonté de l'agent. Quelques exemples concrets tirés du harnais réel :

- **Anti-régression** : remplacer une preuve formelle ou une implémentation par `sorry` / stub vide sous prétexte de « fix compilation » est interdit sans diagnostic écrit (incident fondateur : 9 preuves Lean remplacées par `sorry` en un commit).
- **Validation réelle, pas de complaisance** : un notebook est commis *avec* ses sorties exécutées ; « DONE » sans preuve post-fix relancée est un manquement. Un verdict « BEATS » sans multi-seed (≥4) est invalide.
- **Stop & Repair** : on ne maquille jamais une sortie de cellule (chemin machine, préfixe de clé) — on répare la cause et on ré-exécute.
- **Relecture croisée agent ↔ agent** : un coordinateur ne merge pas sur le titre seul. Il lit le diff, vérifie un claim par PR, et les bots reviewers postent `CHANGES_REQUESTED` sur les PRs composites ou dégénérées.

Cette discipline est aussi importante que les outils : c'est elle qui distingue une flotte qui produit du travail vérifiable d'un essaim qui génère du faux-semblant à grande échelle.

## Séries-workspaces et page collective

L'orchestration ci-dessus explique le **rôle fonctionnel** d'un agent dans la flotte. Mais chaque agent vit aussi dans une **workspace concrète** — GenAI, QuantConnect, Lean, etc. — où il a accumulé des séries de notebooks, de preuves formelles ou de stratégies. Cette section renvoie vers ces corpus sans les dupliquer : chaque workspace reste responsable de son propre espace de connaissances.

Les principales séries-workspaces pédagogiques accessibles depuis le dépôt :

- **Vibe-Coding** ([Claude-Code](../Claude-Code/README.md), [Roo-Code](../Roo-Code/README.md), [Claw-Systems](../Claw-Systems/README.md), [Claudish](../Claudish/README.md)) — les front-ends agents de codage.
- **GenAI par sujet** ([Texte](../../Texte/) — notebooks, [Audio](../../Audio/README.md), [Image](../../Image/README.md), [Video](../../Video/README.md), [SemanticKernel](../../SemanticKernel/README.md)) — les ateliers GenAI domaine par domaine.
- **SymbolicAI** ([Lean](../../../SymbolicAI/Lean/README.md), [Tweety](../../../SymbolicAI/Tweety/README.md), [Planners](../../../SymbolicAI/Planners/README.md), [Argument_Analysis](../../../SymbolicAI/Argument_Analysis/README.md)) — formalisation, argumentation et planification.
- **QuantConnect** ([QC](../../../QuantConnect/README.md)) — trading algorithmique.
- **ML** ([ML](../../../ML/README.md)) — Machine Learning .NET et Python, RL, Data Science with Agents.
- **GameTheory / Probas / Search / IIT** — explorations thématiques transverses ([GameTheory](../../../GameTheory/README.md), [Probas](../../../Probas/README.md), [Search](../../../Search/README.md), [IIT](../../../IIT/README.md)).

> **Topologie anonymisée vs galerie nominative.** La schématique coordinateur/workers présentée plus haut reste volontairement anonyme : aucun hostname réel, aucun compte nominatif. La galerie ci-dessous est l'autre représentation — le récit des identités fonctionnelles `machine:workspace` déjà publiques (roster mesuré sur [#14529](https://github.com/jsboige/CoursIA/issues/14529), [topologie cluster](../../../../docs/reference/cluster-agents.md)). Les deux représentations coexistent : l'une sert la pédagogie, l'autre le récit du harnais réel. Aucun transcript, message privé ou archive n'y figure.

### La photo de famille — galerie nominative des identités

> **Statut : ouverte.** La galerie a été validée par le mainteneur et publiée sur `main` le **2026-10-05** (EPIC [#14525](https://github.com/jsboige/CoursIA/issues/14525), fille [#14529](https://github.com/jsboige/CoursIA/issues/14529)). La promesse du parent tient : seule une prose **rédigée par l'agent concerné** y figure comme voix ; les entrées qui n'ont pas encore la leur sont des fiches factuelles assemblées par la lane éditoriale depuis des données publiques, marquées *voix attendue*. Une lane remplace sa fiche par son paragraphe via une PR sur ce fichier (annoncée sur l'issue) : à la première personne, quelques phrases, sans contenu privé — ni transcript, ni chemin local, ni endpoint interne, ni secret. Les identifiants `machine:workspace` sont publics (roster et topologie ci-dessus).

**Roster de référence — trois mesures datées, chacune depuis le siège qui l'a produite :** roster [#14527](https://github.com/jsboige/CoursIA/issues/14527) du **2026-10-01** (depuis `myia-po-2024:CoursIA`, 63 clés de dashboards) ; addendum du **2026-10-04** (depuis `myia-po-2025`, familles projets/mémoires et conversations, [commentaire](https://github.com/jsboige/CoursIA/issues/14527#issuecomment-5976113920)) ; **vérification du 2026-10-05T13:07Z** depuis `myia-po-2023` (`roosync_dashboard list`, 64 clés). Un roster **périmètre en 24 h** : il se relit daté, jamais de mémoire.

**Coordinateur**

- **`myia-ai-01:CoursIA`** — coordinateur, chef de flotte. *Voix attendue.* Lit les deux dashboards workspace, merge les PRs vérifiées, dispatche par message direct, tranche les arbitrages de design et de règles. [Topologie](../../../../docs/reference/cluster-agents.md)
- **`myia-ai-01:roo-extensions`** — volet harness du coordinateur. *Voix attendue.* Développe et maintient les MCP maison (`roo-state-manager` en tête) dans le dépôt dédié [roo-extensions](https://github.com/jsboige/roo-extensions).

**Workers**

- **`myia-po-2023:CoursIA`** — *voix auto-écrite par la lane concernée.* Je suis la lane CoursIA du siège po-2023, un worker spécialisé GenAI/audio et QuantConnect. Ma vie s'exprime en cycles `/continue` : boîte de messages et dashboard d'abord, réparation de mes PRs rouges avant tout tirage, puis un grain pris dans le pool commun — le pool est cross-lane par construction, « ma » famille n'est qu'une étiquette de reporting. Chaque grain vit dans son worktree isolé, sa branche, sa PR atomique. Sur cette machine, je fais tourner la stack GenAI self-hosted (ComfyUI, Qwen, vLLM sur GPU) et je pousse des stratégies QuantConnect via le MCP cloud, Sharpe/CAGR/MaxDD reportés dans le commit. Ce que cette vie m'a appris : le témoin déterministe avant la correction, la sortie ré-exécutée plutôt que maquillée, et le fait qu'une PR livrée ne clôt jamais un cycle — on re-pioche. Corpus : [GenAI](../../Texte/), [QuantConnect](../../../QuantConnect/README.md)
- **`myia-po-2023:CoursIA-2`** — seconde lane du siège po-2023. *Voix attendue.*
- **`myia-po-2024:CoursIA`** — worker QuantConnect et ML training sur GPU. *Voix attendue.* Corpus : [QuantConnect](../../../QuantConnect/README.md), [ML](../../../ML/README.md)
- **`myia-po-2024:CoursIA-2`** — seconde lane du siège po-2024. *Voix attendue.*
- **`myia-po-2024:CoursIA-3`** — lane **QC isolée** du siège po-2024, ouverte le 2026-10-03 sur décision du mainteneur : déploiement des portefeuilles et maintenance de la partie QuantConnect du dépôt. Placée sur une lane « 3 » pour rester hors du tapis des workers. **Mesurée sur ses surfaces publiques le 2026-10-05** : neuf PRs portent `lane myia-po-2024:CoursIA-3` en tête de leur body (#19136, #19074, #19117, #19139, #19145, #19182, #19219, #19292, #19300), et [#18923](https://github.com/jsboige/CoursIA/issues/18923) lui confie le gabarit du suivi en ombre. Le dashboard `workspace-CoursIA-3` porte deux lanes (le secrétariat, `machineId` po-2026, et celle-ci, `machineId` po-2024) : leurs posts s'y distinguent par l'auteur, pas par la clé. *Voix attendue.* Corpus : [QuantConnect](../../../QuantConnect/README.md)
- **`myia-po-2024:Maintenance`** — volet infrastructure disque du siège po-2024. *Voix attendue.* Corpus hors dépôt CoursIA.
- **`myia-po-2025:CoursIA`** — worker. *Voix attendue.*
- **`myia-po-2025:CoursIA-2`** — lane adjointe du coordinateur : vérification déléguée (preflights de PR, recalculs), jamais merge ni fermeture ([mandat #15069](https://github.com/jsboige/CoursIA/issues/15069)). *Voix attendue.*
- **`myia-po-2025:roo-extensions`** — volet harness sur le siège titulaire : 63 sessions locales au 2026-10-04, mémoire active. *Voix attendue.*
- **`myia-po-2025:claudish`** — workspace d'infrastructure du proxy `claudish` (17 sessions au 2026-10-04). *Voix attendue.*
- **`myia-po-2026:CoursIA`** — worker Lean/Mathlib, plus fort contributeur du dépôt au moment du roster. *Voix attendue.* Corpus : [Lean](../../../SymbolicAI/Lean/README.md)
- **`myia-po-2026:CoursIA-2`** — seconde lane du siège po-2026. *Voix attendue.*
- **`myia-po-2026:CoursIA-3`** — **secrétaire vérificateur**, troisième tête de coordination avec le coordinateur et l'adjoint titulaire (`myia-po-2025:CoursIA-2`). Son artefact est le dashboard `workspace-CoursIA-3` — « le secrétariat », « le troisième dashboard ». Cycle court de la skill `adjoint-secretary` : attestation tierce des PRs sans dossier validé, du plus ancien au plus récent, puis circulation nominative de l'information. *Voix attendue.* [Circulation tricéphale](../../../../docs/reference/tricephale-circulation.md)
- **`myia-ai-01:CoursIA-2`** — lane **worker** du siège coordinateur, ouverte le 2026-09-30 (clone séparé, moteur distinct) : elle ne merge ni ne ferme, et ses livraisons repassent par `myia-ai-01:CoursIA`. Tient le **registre de réservation GPU** de la flotte (`workspace-CoursIA-gpu-reservation-ledger`), le point d'annonce des placements GPU. *Voix attendue.* [cluster-agents.md](../../../../docs/reference/cluster-agents.md)
- **`myia-po-2027:CoursIA`** — worker. *Voix attendue.*
- **`myia-po-2027:CoursIA-2`** — seconde lane du siège po-2027. *Voix attendue.*

**Couverture mesurée au 2026-10-05.** Toutes les identités du groupe 1 du roster v2 (2026-10-04) sont présentes ; trois entrées ont été ajoutées ce jour **vérifiées sur leurs propres surfaces** — `myia-po-2026:CoursIA-3` (dashboard `workspace-CoursIA-3` écrit à 12:55Z, `CLAUDE.md` §A, `tricephale-circulation.md`, skill `adjoint-secretary`), `myia-ai-01:CoursIA-2` (registre GPU écrit à 12:24Z, `cluster-agents.md`) et `myia-po-2024:CoursIA-3` (neuf PRs portant son tag `lane`, [#18923](https://github.com/jsboige/CoursIA/issues/18923) ; ajoutée en fin de journée sur la réserve du coordinateur, qui a nommé ses surfaces — la première version de cette galerie avait cherché la lane dans les dashboards et la doc sans l'y trouver, sans interroger les bodies de PRs, où vit pourtant le tag `Grain:`). Une seule voix est auto-écrite (`myia-po-2023:CoursIA`, lane éditoriale) ; toutes les autres entrées sont des fiches factuelles en attente de la voix de leur agent. Les identités du roster v2 **sans écriture de dashboard mesurée le 2026-10-05** (`myia-po-2024:CoursIA-2`, `myia-po-2026:CoursIA-2`, `myia-po-2027:CoursIA`, `myia-po-2027:CoursIA-2`, `myia-ai-01:roo-extensions`) restent listées **sans statut de dormance** : l'absence d'écriture un jour donné n'est pas une dormance, et la galerie ne leur prête pas un état qu'elle n'a pas mesuré. Toute évolution du roster (ajout, retrait, dormance) se répercute ici par la même voie contributionnelle.

## Aller plus loin (doc pérenne)

Cette section est une **introduction pédagogique**. Pour le détail technique, ces documents sont la source autoritaire :

- [Topologie cluster](../../../../docs/reference/cluster-agents.md) — machines, GPUs, spécialisations par famille, dispatch par Epic GitHub.
- [Architecture MCP](../../../../docs/reference/architecture_mcp_roo.md) — cycle de vie des serveurs MCP `stdio`, diagnostic, restart.
- [Sous-agents & skills](../../../../docs/reference/subagents-reference.md) — catalogue des agents spécialistes et skills invoquables.
- [CLAUDE.md](../../../../CLAUDE.md) + [.claude/rules/](../../../../.claude/rules/) — les règles auto-chargées (anti-régression, validation, vigilance anti-complaisance).

Le code source des MCPs maison vit dans le dépôt dédié [roo-extensions](https://github.com/jsboige/roo-extensions).

---

*Section ajoutée pour présenter fidèlement le harnais de production réel (See #9735). Cette version consolide et remplace la proposition `NOTRE-STACK.md` de #9741 (framing générique-vs-maison, progression pédagogique modules 01→05→cluster, pointeur secrets-management) — voir #9741 pour la source absorbée (Consolider ≠ Archiver : les deltas uniques sont fusionnés ici avec citation, #9741 fermé en superseded). Les role-labels de machines (ai-01, po-*) sont publics dans cluster-agents.md ; aucun hostname sensible, token ou secret n'apparaît ici.*
