blog.vfg.lol

La Communauté de l'Anneau du blog — audit de quatre PR et naissance d'une équipe d'agents role-play

De Gandalf à Sauron : comment consolider #46–#49 en une chaîne éditoriale sûre, testable et activable depuis Cursor et WSL

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

PRBrancheFichiersLignes ajoutées
#46cursor/blog-publisher-3063bard-magician.md28
#47cursor/blog-bard-magician-e88cbard-magician.md83
#48cursor/create-vfg-mcp-subagent-65e4vfg-mcp-router.md80
#49cursor/blog-deploy-guardian-subagent-c0fe5× blog-*.md384

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

PersonnageAgent CursorPhaseReadonlyEffet externe
Gandalfgandalf-blog-orchestratororchestrateouiaucun
Palantírpalantir-blog-scoutresearchouiaucun
Bilbobilbo-blog-barddraftouiaucun
Galadrielgaladriel-blog-editoreditouiaucun
Sauronsauron-blog-red-teamgateouiaucun
Samwisesamwise-blog-publisherpublishnonpublish ciblé

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

3.2 Quête standard

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)

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)

ZoneChangement
.cursor/agents/6 subagents role-play
config/blog-roleplay-agents.jsonmanifeste + RFC MCP
test/blog-roleplay-agents.test.mjs6 tests structurels
.cursor/rules/vfg-mcp-first.mdchotfix feed vs gate corrigé
.cursor/rules/blog-roleplay-community.mdcrappel always-on workflow
docs/BLOG-AGENTS-ROLEPLAY.mdarchitecture + audit
docs/PLAN-BLOG-AGENTS-ROLEPLAY.mdroadmap phases 0–4
docs/SETUP-CURSOR-WSL-BLOG-AGENTS.mdactivation IDE
scripts/setup-wsl-blog-agents-env.shtemplate env WSL
docs/WORKFLOW-PUBLICATION-BLOG.mdretrait --skip-ping prod

5. MCP — aujourd'hui et demain

5.1 Outils existants (allowlist)

AgentOutils MCPEffet
Palantírvfg_boot_context, vfg_search_docs, vfg_ssot_get, vfg_timeline, vfg_graph_neighbors, vfg_health, vfg_snapshot, vfg_acts, vfg_events_recent, vfg_gate_healthlecture
Samwisevfg_commands_devblog_publishpublish

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é :

OutilRôle
vfg_blog_contextRegistre sources (Palantír)
vfg_blog_validatePASS/BLOCK (Sauron)
vfg_blog_previewPreview locale
vfg_blog_publishPublish idempotent
vfg_blog_verifyPreuve URL + API
vfg_blog_recovery_planPlan 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 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)

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 :

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

Résultat attendu : 6/6 pass.


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

PhaseContenuGate
0Merge PR #50, fermer #46–#49tests verts
1Env Windows/WSL + brouillon testfichier draft
2Publish prod contrôléURL vérifiée
3MCP vfg_blog_* sur VPS3 outils live
4Hooks Cursor failClosedtests hors blog

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


9. Risques résiduels

RisqueMitigation actuelleSuite
Cursor readonly ne bloque pas MCP mutatifprompts + manifestehooks phase 4
Quatre PR ouvertesfermer après #50FG
Série audit Gandalf 07/07 cite CI auto-deploydatée — local-first depuis 08/07note dans articles historiques
Article historique « 278 articles deploy auto »ne pas réutiliser comme état livePalantí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

B. Invocations types

/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) :

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.

source markdown

Concepts de cet article

gateMCPhandoffSSOTVPSgardeVFVFGPTCitadelle

Partage le plus de concepts avec