Aller au contenu

PD-293 — One Ring : orchestration multi-stories via claude-peers + contrôle iPhone

1. Contexte

Le workflow de gouvernance ProbatioVault (11 étapes, /gov) fonctionne en mode single-story : un humain pilote une session Claude Code qui orchestre une seule PD-XXX à la fois. Le workflow supporte déjà le parallélisme technique (chaque story a sa propre FSM Jira), mais le goulot d'étranglement est le coût cognitif humain de suivre N sessions simultanées.

Problème : Quand 3-5 stories sont en cours sur des projets différents (backend, app, infra...), l'humain doit jongler entre N fenêtres/terminaux, répondre aux escalades de chaque session, et maintenir le contexte mental de chacune. Résultat : throughput limité à ~1 story active à la fois.

Source : Veille claude-peers (2026-03-27), bcherny features (2026-03-30), discussion ProbatioVault (2026-03-30).

2. Besoin

En tant que PO/architecte ProbatioVault (The Sovereign), je veux une session Claude Code unique (The One Ring) qui orchestre N sessions autonomes (Ringbearers) exécutant chacune /gov PD-XXX, afin de piloter plusieurs stories en parallèle depuis une seule interface, y compris depuis mon iPhone via /remote-control.

3. Architecture LOTR

┌─────────────────────────────────────────────────────────┐
│  The Sovereign (humain, iPhone)                         │
│  Source d'intention, validation finale                  │
│  Interface : /remote-control                            │
└───────────────────────┬─────────────────────────────────┘
                        │ commandes / réponses
┌─────────────────────────────────────────────────────────┐
│  The One Ring (session Claude Code Lord)                │
│  Orchestre N sessions, poll avancement, remonte         │
│  escalades, crée/détruit des Ringbearers               │
│  ⚠️ NE EXECUTE RIEN — pur routeur/interface            │
│  Skill : /gov-lord                                     │
└───────┬──────────┬──────────┬───────────────────────────┘
        │          │          │  claude-peers-mcp
        ▼          ▼          ▼  (list_peers, send_message)
┌──────────┐ ┌──────────┐ ┌──────────┐
│Ringbearer│ │Ringbearer│ │Ringbearer│
│ /gov     │ │ /gov     │ │ /gov     │
│ PD-275   │ │ PD-282   │ │ PD-293   │
│(backend) │ │(backend) │ │(ia-gov)  │
└──────────┘ └──────────┘ └──────────┘
  Sessions Claude Code autonomes
  Chacune a ses propres credentials

4. Périmètre fonctionnel

4.1 Installation et configuration claude-peers-mcp

  • Intégrer claude-peers-mcp (https://github.com/louislva/claude-peers-mcp) dans l'écosystème ProbatioVault
  • Configurer le broker (localhost:7899, SQLite) pour auto-launch
  • Ajouter la config MCP dans .mcp.json du repo ia-governance

4.2 Skill /gov-lord (The One Ring)

Skill d'orchestration multi-stories. Commandes :

Commande Description
/gov-lord start PD-XXX [projet] Crée un Ringbearer (nouvelle session Claude Code) et lance /gov PD-XXX
/gov-lord status Poll tous les Ringbearers, affiche tableau de bord consolidé
/gov-lord stop PD-XXX Arrête un Ringbearer
/gov-lord escalade Liste les escalades en attente de réponse humaine
/gov-lord respond PD-XXX "réponse" Transmet une réponse du Sovereign à un Ringbearer

Invariant de sécurité critique (INV-293-01) : Le One Ring NE DOIT JAMAIS exécuter de commande qui sort de son rôle d'interface. Il ne lit pas de code, ne modifie pas de fichier, ne touche pas à Jira, ne lance pas de build. Il communique UNIQUEMENT avec les Ringbearers via claude-peers-mcp. Toute demande hors scope doit être bloquée avec message explicite.

4.3 Démarrage rapide des Ringbearers

  • Chaque Ringbearer est une session Claude Code lancée avec les options minimales pour démarrage rapide
  • Le Ringbearer exécute /gov PD-XXX projet en totale autonomie
  • Le Ringbearer utilise set_summary pour publier son état courant (étape, gate, verdict...)
  • Le Ringbearer remonte ses escalades via send_message au One Ring

4.4 Skill /remote-control (interface iPhone)

Interface mobile permettant au Sovereign de piloter le One Ring depuis l'iPhone :

  • Voir le tableau de bord consolidé (N stories, état, escalades)
  • Répondre aux escalades
  • Lancer/arrêter des Ringbearers
  • Fonctionnement via Claude Code web app (claude.ai/code) sur Safari mobile

4.5 Protocole de communication

Messages Ringbearer → One Ring : - STATUS_UPDATE : changement d'étape/gate (auto, via set_summary) - ESCALADE : question nécessitant décision humaine (bloquant) - GATE_RESULT : verdict de gate (GO/RESERVE/NON_CONFORME) - WORKFLOW_DONE : story terminée

Messages One Ring → Ringbearer : - PO_RESPONSE : réponse à une escalade - PAUSE : mettre en pause - RESUME : reprendre - ABORT : abandon de la story

5. Hors périmètre

  • Modification du workflow /gov existant (les Ringbearers l'utilisent tel quel)
  • Partage de credentials entre sessions (chaque Ringbearer a ses propres accès)
  • Interface native iOS (on utilise Claude Code web app)
  • Communication directe entre Ringbearers (tout passe par le One Ring)

6. Contraintes

Contrainte Description
Sécurité Le One Ring n'a accès à AUCUN credential projet (Vault, GitLab, Jira). Il ne peut que communiquer via claude-peers-mcp.
Isolation Chaque Ringbearer est une session isolée avec son propre contexte, ses propres credentials, son propre working directory.
Scalabilité Supporter jusqu'à 5 Ringbearers simultanés (limite raisonnable pour un MacBook).
Latence Le polling du broker (1s) est acceptable. Les escalades doivent apparaître en < 5s sur le One Ring.
Résilience Si un Ringbearer crash, le One Ring le détecte (peer disparu) et le signale au Sovereign.

7. Critères d'acceptation préliminaires

  • CA-01 : Le One Ring peut lister les Ringbearers actifs via list_peers
  • CA-02 : Le One Ring peut créer un Ringbearer qui lance /gov PD-XXX en autonomie
  • CA-03 : Les escalades des Ringbearers apparaissent sur le One Ring en < 5s
  • CA-04 : Le Sovereign peut répondre à une escalade via /gov-lord respond
  • CA-05 : Le One Ring refuse toute commande hors scope (lecture code, modification fichier, accès Jira direct)
  • CA-06 : /remote-control affiche le tableau de bord consolidé depuis iPhone
  • CA-07 : Un Ringbearer crashé est détecté et signalé au Sovereign
  • CA-08 : Le workflow /gov existant fonctionne sans modification dans un Ringbearer

8. Dépendances

Dépendance Type Statut
claude-peers-mcp Externe (npm) Disponible (github.com/louislva/claude-peers-mcp)
Claude Code /remote-control Feature Claude Code À vérifier disponibilité
claude/channel protocol Feature Claude Code Utilisé par claude-peers-mcp
Claude Code web app (iPhone) Plateforme Disponible (claude.ai/code)

9. Arbitrages et décisions

  • Pourquoi LOTR ? Métaphore volontaire : le One Ring contrôle les Ringbearers, mais le Sovereign (humain) reste au-dessus. L'anneau est un outil, pas un maître.
  • Pourquoi pas de communication directe inter-Ringbearers ? Principe de moindre complexité. Le One Ring comme médiateur unique simplifie le debug et la traçabilité. Si un Ringbearer a besoin d'info d'un autre projet, il passe par le One Ring qui route.
  • Pourquoi limiter à 5 ? Ressources machine (RAM, CPU, contexte LLM) + coût API. Au-delà de 5, le One Ring lui-même devient un goulot.

10. Diagrammes

10.1 Flux de création d'un Ringbearer

sequenceDiagram
    participant S as Sovereign (iPhone)
    participant O as One Ring
    participant B as Broker (localhost:7899)
    participant R as Ringbearer

    S->>O: /gov-lord start PD-275 backend
    O->>O: Vérifie scope (OK: création Ringbearer)
    O->>R: Lance session Claude Code (claude --bare)
    R->>B: register_peer()
    R->>R: /gov PD-275 backend
    R->>B: set_summary("PD-275: étape 0 - besoin")
    O->>B: list_peers()
    B-->>O: [Ringbearer PD-275: "étape 0 - besoin"]
    O-->>S: ✅ Ringbearer PD-275 démarré — étape 0

10.2 Flux d'escalade

sequenceDiagram
    participant S as Sovereign (iPhone)
    participant O as One Ring
    participant R as Ringbearer PD-275

    R->>O: send_message(ESCALADE, "Gate 3 RESERVE — invariant INV-03 ambigu, besoin clarification PO")
    O->>O: Vérifie scope (OK: remontée escalade)
    O-->>S: 🚨 ESCALADE PD-275 : "Gate 3 RESERVE — invariant INV-03 ambigu"
    S->>O: /gov-lord respond PD-275 "L'invariant INV-03 s'applique uniquement aux documents signés"
    O->>R: send_message(PO_RESPONSE, "L'invariant INV-03 s'applique uniquement aux documents signés")
    R->>R: Continue Gate 3 avec la clarification