---
title: "La Communauté de l'Anneau du blog — audit de quatre PR et naissance d'une équipe d'agents role-play"
subtitle: "De Gandalf à Sauron : comment consolider #46–#49 en une chaîne éditoriale sûre, testable et activable depuis Cursor et WSL"
date: 2026-07-12
time: "21:00"
author: VFG
publishedBy: idea
status: pub
tags: ["workflows-agentiques", "cursor", "subagents", "blog", "mcp", "gandalf", "roleplay", "audit"]
---

## TL;DR

- Quatre PR ouvertes le même soir (#46–#49) proposaient **quatre visions concurrentes** du même problème : publier le blog avec des subagents Cursor.
- L'audit montre des **conflits de noms**, des **gates prod insuffisants**, un **routeur MCP dupliqué**, et des **playbooks SCP** hérités de l'incident catalogue du 9 juillet.
- La consolidation livrée en **PR #50** remplace tout cela par **six personnages** : Gandalf (orchestre), Palantír (sources), Bilbo (barde), Galadriel (relecture), Sauron (red team), Samwise (seul publisher).
- Le role-play sert d'**interface mémorable** ; la sécurité repose sur un **dossier scellé SHA-256**, `prepublish`, dry-run, et autorisation explicite pour `blog.vfg.lol`.
- Activation documentée : `docs/SETUP-CURSOR-WSL-BLOG-AGENTS.md` + script WSL `scripts/setup-wsl-blog-agents-env.sh`.

---

## 1. Pourquoi une « Communauté » plutôt qu'un magicien omnipotent

Le blog VFG n'est pas qu'un dépôt markdown. C'est la **mémoire narrative du Royaume** — série d'audits Gandalf de juillet 2026, handoffs de sessions agentiques, chronique des gates R0–R3. Quand quatre agents cloud ouvrent quatre PR en quelques secondes pour « gérer la publication », on recrée le chaos du **doublon Citadelle** : même intention, quatre implémentations, zéro SSOT.

La métaphore Tolkien n'est pas décorative. Elle reprend une convention déjà ancrée dans le corpus :

- **Gandalf le Documenteur** — sommaire de l'audit du Royaume (`2026-07-07-gandalf-sommaire-audit-royaume.md`).
- **L'Œil / Sauron** — red team implicite dans les articles « question du magicien » (QCM traçable).
- **La Communauté** — délégation claire : personne ne porte seul l'Anneau de la publication prod.

Le principe technique est inverse du one-shot « Bard Magician » : **un rôle = un pouvoir = un effet externe maximum**.

---

## 2. Méthode de recherche — comment les quatre PR ont été auditées

### 2.1 Périmètre

| PR | Branche | Fichiers | Lignes ajoutées |
|----|---------|----------|-----------------|
| [#46](https://github.com/FGDidou/RAPPORT-EXPERIENTIEL/pull/46) | `cursor/blog-publisher-3063` | `bard-magician.md` | 28 |
| [#47](https://github.com/FGDidou/RAPPORT-EXPERIENTIEL/pull/47) | `cursor/blog-bard-magician-e88c` | `bard-magician.md` | 83 |
| [#48](https://github.com/FGDidou/RAPPORT-EXPERIENTIEL/pull/48) | `cursor/create-vfg-mcp-subagent-65e4` | `vfg-mcp-router.md` | 80 |
| [#49](https://github.com/FGDidou/RAPPORT-EXPERIENTIEL/pull/49) | `cursor/blog-deploy-guardian-subagent-c0fe` | 5× `blog-*.md` | 384 |

### 2.2 Grille d'audit

Chaque PR a été lue contre :

1. **SSOT publication** — `docs/WORKFLOW-PUBLICATION-BLOG.md`, `scripts/publish-local.mjs`, `scripts/lib/mcp-auto-publish.mjs`.
2. **Incident prod** — `handoffs/2026-07-09-incident-prod-articles-style-regression.md` (SCP depuis mauvais cwd, catalogue 284 vs 346).
3. **Conventions Cursor 2026** — frontmatter `name`, `description`, `model`, `readonly`, `is_background` (pas de champ `tools:` natif).
4. **MCP live** — serveurs `vfg-docs`, `vfg-feed`, `vfg-gate`, `vfg-commands` ; hotfix catalogue/runbook sur **feed**, deploy sur **gate**.
5. **Testabilité** — présence de tests CI vérifiant structure et gates.

### 2.3 Synthèse par PR

#### PR #46 — minimaliste, trop monolithique

**Points forts :** intention de sécurité, handoff structuré (Intent / Changed / Validation / Deployment / Risks), rappel « prepare ≠ deploy ».

**Points faibles :** un seul agent cumule rédaction, contrôle et publication ; aucune matrice local/prod ; le « structural check Node » annoncé dans le corps de PR **n'est pas livré** dans le dépôt.

**Verdict :** rework — bonne intention, mauvaise séparation des pouvoirs.

#### PR #47 — la meilleure base éditoriale, toujours monolithique

**Points forts :** `draft` par défaut, recherche sourcée, dry-run `publish-local.mjs`, MCP-first, références workflow, interdiction secrets.

**Points faibles :** même fichier `bard-magician.md` que #46 ; rôle **auteur + publisher** non séparé ; conflit direct avec #49.

**Verdict :** rework — conserver le fond éditorial, éclater les rôles.

#### PR #48 — routeur MCP utile mais mal positionné

**Points forts :** discipline `GetMcpTools` → `CallMcpTool`, anti-patterns grep/shell, fallback si MCP down.

**Points faibles :** **duplique** `.cursor/rules/vfg-mcp-first.mdc` (déjà `alwaysApply: true`) ; table hotfix simplifiée à tort (`vfg_hotfix_*` sur gate only) ; chevauche le futur `blog-magician` de #49.

**Verdict :** rework — absorber la discipline dans Palantír/Samwise, ne pas ajouter un septième routeur.

#### PR #49 — meilleure architecture, gates prod insuffisants

**Points forts :** split bard / publier / magician / guardian / controller ; leçons incident 2026-07-09 ; chemin admin API canonique ; MCP-first.

**Points faibles :**

- Template frontmatter avec **`status: pub` par défaut** (inverse de #47).
- Aucune **autorisation humaine explicite** avant prod.
- Commandes dev incorrectes (`node src/server.js` vs `npm run dev`).
- **`--skip-ping`** sur prod normalisé.
- Playbook **SCP** encore central (classe d'incident).
- **Zéro test** automatisé.

**Verdict :** rework — garder la taxonomie, durcir les gates, ajouter tests.

---

## 3. Architecture retenue — la Communauté de l'Anneau

### 3.1 Distribution des rôles

| Personnage | Agent Cursor | Phase | Readonly | Effet externe |
|------------|--------------|-------|----------|---------------|
| Gandalf | `gandalf-blog-orchestrator` | orchestrate | oui | aucun |
| Palantír | `palantir-blog-scout` | research | oui | aucun |
| Bilbo | `bilbo-blog-bard` | draft | oui | aucun |
| Galadriel | `galadriel-blog-editor` | edit | oui | aucun |
| Sauron | `sauron-blog-red-team` | gate | oui | aucun |
| Samwise | `samwise-blog-publisher` | publish | non | publish ciblé |

Fichiers : `.cursor/agents/<nom>.md`  
Contrat machine : `config/blog-roleplay-agents.json`

### 3.2 Quête standard

```text
demande utilisateur
       ↓
   Gandalf — cadre intention + cible
       ↓
   Palantír — registre faits datés + doublons
       ↓
   Bilbo — Markdown status:draft
       ↓
   parent — écrit le fichier ; draft→pub si prod autorisée
       ↓
   Galadriel — APPROVE_DRAFT
       ↓
   Sauron — PASS sur SHA-256 exact
       ├─ brouillon → FIN
       └─ prod explicite → Samwise
                              ↓
                    prepublish + dry-run
                              ↓
                    MCP OU Admin API (un seul)
                              ↓
                    API + URL publique vérifiée
```

### 3.3 Loi de l'Anneau (gates non négociables)

1. « Rédige », « raconte », « prépare » ⇒ **brouillon**, jamais prod.
2. Prod ⇒ phrase utilisateur du **tour courant** nommant `blog.vfg.lol` ou « prod ».
3. Un mot de passe présent **≠** autorisation.
4. **Un seul transport** de publication par article.
5. **Jamais** hotfix fleet, SCP, rsync, ou `git push` comme publication.
6. Toute correction après Galadriel/Sauron ⇒ **nouvelle empreinte SHA-256**.

### 3.4 Dossier scellé (extrait)

```yaml
article_path: devblog/posts/workflows-agentiques/2026-07-12-….md
content_sha256: <sha256>
target: prod
desired_status: pub
user_authorization_quote: "Publie sur blog.vfg.lol …"
production_authorized: true
galadriel_verdict: APPROVE_DRAFT
sauron_verdict: PASS
```

---

## 4. Ce qui a changé dans le dépôt (PR #50)

| Zone | Changement |
|------|------------|
| `.cursor/agents/` | 6 subagents role-play |
| `config/blog-roleplay-agents.json` | manifeste + RFC MCP |
| `test/blog-roleplay-agents.test.mjs` | 6 tests structurels |
| `.cursor/rules/vfg-mcp-first.mdc` | hotfix feed vs gate corrigé |
| `.cursor/rules/blog-roleplay-community.mdc` | rappel always-on workflow |
| `docs/BLOG-AGENTS-ROLEPLAY.md` | architecture + audit |
| `docs/PLAN-BLOG-AGENTS-ROLEPLAY.md` | roadmap phases 0–4 |
| `docs/SETUP-CURSOR-WSL-BLOG-AGENTS.md` | activation IDE |
| `scripts/setup-wsl-blog-agents-env.sh` | template env WSL |
| `docs/WORKFLOW-PUBLICATION-BLOG.md` | retrait `--skip-ping` prod |

---

## 5. MCP — aujourd'hui et demain

### 5.1 Outils existants (allowlist)

| Agent | Outils MCP | Effet |
|-------|------------|-------|
| Palantír | `vfg_boot_context`, `vfg_search_docs`, `vfg_ssot_get`, `vfg_timeline`, `vfg_graph_neighbors`, `vfg_health`, `vfg_snapshot`, `vfg_acts`, `vfg_events_recent`, `vfg_gate_health` | lecture |
| Samwise | `vfg_commands_devblog_publish` | publish |

Configuration client : `.cursor/mcp.json` → endpoints VPS Gandalf.

### 5.2 RFC — six outils `vfg_blog_*` (non déployés)

Proposés pour un futur serveur MCP blog dédié :

| Outil | Rôle |
|-------|------|
| `vfg_blog_context` | Registre sources (Palantír) |
| `vfg_blog_validate` | PASS/BLOCK (Sauron) |
| `vfg_blog_preview` | Preview locale |
| `vfg_blog_publish` | Publish idempotent |
| `vfg_blog_verify` | Preuve URL + API |
| `vfg_blog_recovery_plan` | Plan recovery non destructif |

Ils ne sont **pas** annoncés comme disponibles tant qu'ils ne sont pas implémentés côté `vfg-commands` / VFVFGPT.

---

## 6. Activer chez soi — Cursor et WSL

### 6.1 Windows (Cursor)

1. Pull la branche contenant PR #50 (ou `main` après merge).
2. Définir `MCP_COMMANDS_AUTH_TOKEN` et `TELEMETRY_AUTH_TOKEN` (variables utilisateur).
3. Reload Cursor.
4. Vérifier MCP verts dans le panneau outils.
5. Tester : `/gandalf-blog-orchestrator prépare un brouillon sur …`

### 6.2 WSL

```bash
bash scripts/setup-wsl-blog-agents-env.sh
source ~/.config/vfg/blog-agents.env
npm test
node --test test/blog-roleplay-agents.test.mjs
```

Guide complet : `docs/SETUP-CURSOR-WSL-BLOG-AGENTS.md`.

### 6.3 Stack locale (preview)

```bash
npm run dev                                    # :5195 lecture
node --env-file=.env admin/server.mjs         # :5220 admin
node scripts/publish-local.mjs <article.md> --dry-run
```

---

## 7. Tests — preuve que la suite est vérifiable

Contrairement aux PR #46–#49, la consolidation inclut **`test/blog-roleplay-agents.test.mjs`** :

- frontmatter Cursor valide sur les 6 agents ;
- Samwise = seul rôle à effets externes ;
- gates `prepublish`, dry-run, PASS Sauron présents dans les prompts ;
- allowlist Palantír = manifeste JSON ;
- audit doc cite les PR #46–#49 ;
- workflow prod sans `--skip-ping`.

Commande :

```bash
node --test test/blog-roleplay-agents.test.mjs
```

Résultat attendu : **6/6 pass**.

---

## 8. Plan d'adoption (résumé)

| Phase | Contenu | Gate |
|-------|---------|------|
| **0** | Merge PR #50, fermer #46–#49 | tests verts |
| **1** | Env Windows/WSL + brouillon test | fichier draft |
| **2** | Publish prod contrôlé | URL vérifiée |
| **3** | MCP `vfg_blog_*` sur VPS | 3 outils live |
| **4** | Hooks Cursor failClosed | tests hors blog |

Détail : `docs/PLAN-BLOG-AGENTS-ROLEPLAY.md`.

---

## 9. Risques résiduels

| Risque | Mitigation actuelle | Suite |
|--------|---------------------|-------|
| Cursor `readonly` ne bloque pas MCP mutatif | prompts + manifeste | hooks phase 4 |
| Quatre PR ouvertes | fermer après #50 | FG |
| Série audit Gandalf 07/07 cite CI auto-deploy | datée — local-first depuis 08/07 | note dans articles historiques |
| Article historique « 278 articles deploy auto » | ne pas réutiliser comme état live | Palantír recoupe dates |

---

## 10. Conclusion — du folklore operatoire

La Communauté de l'Anneau du blog est une réponse à une leçon déjà écrite dans le Royaume : **les garde-fous doivent mordre même leurs auteurs** (cf. audit pipeline blog du 7 juillet — le scanner de secrets et le gardien du temps avaient bloqué la propre PR du magicien).

Quatre PR concurrentes, c'était quatre anneaux forgés en parallèle. La consolidation en PR #50 n'en garde qu'un — porté par Samwise, scellé par Sauron, raconté par Bilbo, observé par Palantír, relu par Galadriel, coordonné par Gandalf.

Le role-play rend le workflow **invocable** : `/gandalf-blog-orchestrator` est plus mémorable qu'un script bash. Les tests et le manifeste JSON rendent le workflow **auditable**. La documentation Cursor/WSL le rend **activable** dès demain matin.

---

## Annexes

### A. Liens

- [PR #50](https://github.com/FGDidou/RAPPORT-EXPERIENTIEL/pull/50)
- [Architecture](../../../docs/BLOG-AGENTS-ROLEPLAY.md)
- [Handoff 2026-07-12](../../../handoffs/2026-07-12-handoff-communaute-anneau-blog-agents.md)

### B. Invocations types

```text
/gandalf-blog-orchestrator prépare un récit sourcé — brouillon uniquement
/palantir-blog-scout établis les faits sur la publication MCP blog
/bilbo-blog-bard transforme ce registre en article accessible
/galadriel-blog-editor relis ce candidat
/sauron-blog-red-team audite ce SHA pour prod
```

Prod (uniquement si voulue) :

```text
Publie sur blog.vfg.lol l'article devblog/posts/…/mon-article.md
```

### C. Références incident

Ne jamais SCP `articles.json` depuis `_a-ranger-citadelle/` — voir handoff `2026-07-09-incident-prod-articles-style-regression.md`.