Drove

01la route

Un orchestrateur multi-agents pour herdr

Un planificateur, plusieurs agents.
Chacun dans son volet et son propre worktree.

Drove fait travailler un planificateur et plusieurs agents côte à côte dans des volets herdr. C’est vous qui choisissez le planificateur : Claude Code ou Codex. Il découpe le travail en tâches Cairn, lance un agent pour chacune, relit leurs diffs et fusionne. Les agents, Claude Code ou Codex eux aussi, écrivent le code.

Une drove road, c’est l’ancienne route du bétail en Écosse, celle que les bouviers suivaient jusqu’au marché, le troupeau à leurs côtés pendant des semaines. Un drove, c’est le troupeau lui-même, mené ensemble, et Drove tourne sur herdr pour qu’il le reste. Drove mène un run de la même façon : un planificateur fait avancer le troupeau, et chaque agent garde sa voie.

Trois façons de lancer le planificateur

  • Claude Code, avec le mod

    /orchestrate

    Un tableau dans Claude, modèle et effort changés à chaque requête, et des boîtes de dialogue dans l’appli.

  • Claude Code, sans le mod

    drove plan --kind claude

    Réveillé par un canal (en préversion de recherche dans Claude Code), ou par frappes clavier.

  • Codex

    drove plan --kind codex

    Réveillé par codex queue ; la question du sixième volet passe par l’élicitation MCP.

0
démon
5
volets d’agents avant qu’un humain dise oui
2
agents de chaque côté : Claude Code, Codex
0
dépendance à l’exécution
Fig. 1Un run : le volet du planificateur, et un onglet d’agents
planificateurclaude · codexdécoupe en tâches Cairnlit chaque diff, rend un verdictdrove mcplit chaque outbox une foisréveille le planificateurrapportoutbox.jsonlverdict · messageherdr · queuew-apicodexdrove/w-apiDROVE-7workingprogressw-uiclaudeworktree-w-uiDROVE-8donedone · revieww-docsclaudeworktree-w-docsDROVE-9idlequestionw-clicodexdrove/w-cliDROVE-10working—~/.drove/runs/<run>/des fichiers, aucun démonroster.json · events.jsonl

Les noms de sièges, les tâches et les états sont des exemples. Les noms de branche sont ceux que Drove utilise : worktree-<seat> pour un agent Claude, drove/<seat> pour un agent Codex.

02un run

Le planificateur planifie.
Les agents écrivent le code.

Chaque agent tourne dans son propre volet herdr, et chaque agent de travail a son propre worktree git. Le planificateur peut être Claude Code ou Codex, et chaque agent de travail aussi, dans n’importe quel mélange. Il n’y a pas de démon : le serveur MCP du planificateur lui-même, ou, pour un planificateur Claude avec le mod, un processus enfant du mod, lit le fichier de rapports de chaque agent et réveille le planificateur. L’état du run, ce sont de simples fichiers sous ~/.drove.

Le planificateur

Claude Code ou Codex
  • Découpe l’objectif en tâches Cairn, et lance un agent par tâche.
  • Lit le diff de chaque agent, répond approve ou changes, et fusionne.
  • Ne modifie jamais le code et ne lance jamais de build : un hook de garde l’en empêche.
  • C’est vous qui le choisissez, de trois façons : /orchestrate dans Claude Code avec le mod, drove plan --kind claude sans lui, ou drove plan --kind codex.

Un agent

Claude Code ou Codex
  • Travaille une référence Cairn, dans son volet et sur sa branche.
  • A un seul outil, report, et rien qui lui permette d’agir sur le run lui-même.
  • Committe ses propres chemins après un approve, et ne pousse jamais.
  • Le worktree d’un agent Claude vient de claude --worktree ; celui d’un agent Codex est créé par Drove.

Comment un message arrive

Chaque rapport passe par la boîte d’envoi de l’agent ; seul le réveil change. Chaque message du planificateur a un identifiant, donc une livraison n’est jamais répétée, et rien n’est jamais tapé dans un volet qui affiche une boîte de dialogue.

Du planificateur à l’agent

Le premier brief
herdr agent start sans prompt, puis le brief par herdr agent prompt une fois l’agent prêt.
Ensuite, à un agent Claude
herdr agent prompt, sous garde : rien n’est tapé dans un volet bloqué, et le message attend.
Ensuite, à un agent Codex
codex queue vers le fil de l’agent, qui met en file même en plein tour.

De l’agent au planificateur

Un planificateur Codex
codex queue vers le fil du planificateur.
Un planificateur Claude avec le mod
Le pont du mod lui transmet les rapports, qui arrivent comme un tour à part entière dès que la session est au repos.
Un planificateur Claude sans le mod
Une notification de canal depuis son serveur MCP, sinon herdr agent prompt une fois son volet au repos depuis cinq secondes.
Tout planificateur
Au passage : chaque résultat d’outil du planificateur se termine par les rapports encore en attente.
~/.drove : tout l’état du run
  • ~/.drovemode 700
  • config.jsonréglages facultatifs
  • runs/<run-id>/
  • run.json
  • roster.jsonécrit sous verrou, de façon atomique
  • events.jsonlen ajout seul, une écriture par ligne
  • planner/pending.jsonlles rapports qu’un réveil n’a pas encore pu livrer
  • seats/<seat>/
  • token32 octets aléatoires, mode 600
  • outbox.jsonlles rapports de l’agent, un seul auteur
  • hooks.jsonlce que les hooks ont vu
  • launch.jsonla spec de lancement, jeton masqué

03la vie d’un agent

La vie d’un agent,
d’un volet à une branche fusionnée.

  1. Lancement

    Le planificateur donne un siège, un type, une référence Cairn et un brief. Drove ouvre un volet, attend l’invite du shell, puis lance l’agent ; s’il n’apparaît pas, il réinitialise le volet et essaie une fois de plus. Le brief arrive une fois l’agent prêt, jamais comme argument de lancement.

  2. Travail

    Un agent Claude reçoit son worktree de claude --worktree, sur la branche worktree-<seat>. Un agent Codex en reçoit un créé par Drove, sur drove/<seat>. L’agent ne pousse jamais : un hook l’en empêche.

  3. Rapport

    L’agent appelle son outil report : done, question, blocked, promote ou progress. Tout sauf progress réveille le planificateur.

  4. Verdict

    Le planificateur lit le diff et répond approve ou changes. Après un approve, l’agent committe ses propres chemins et renvoie done, sans rien attendre en retour.

  5. Fermeture

    Le planificateur fusionne, puis ferme le siège. Un siège Claude se ferme en fermant son volet, jamais avec /exit, et Drove libère le verrou de worktree que Claude laisse derrière lui. Codex reçoit d’abord /quit. Un worktree n’est supprimé que sur demande, et seulement quand sa branche est fusionnée.

Les cinq rapports

TypeAttend
donereview
questionanswer
blockedanswer
promoteanswer
progressnone

outbox.jsonl

{"v":1,"id":"r-<seat>-<ms>-<4hex>","run":"…","seat":"w-api","token":"…","kind":"done","expects":"review","summary":"one line","details":"branch, files, test output","at":"2026-10-09T10:20:53.000Z"}
Un verdict, tel que l’agent le reçoit
⟦drove v1 run=drove-20261009-1042-a3f1 from=planner to=w-api id=c-17 kind=verdict verdict=approve expects=none mac=9f2c0d1e⟧Approved. Commit only your own paths now …↩ Reply with the drove report tool (server drove): kind done, expects none, with the branch and the commit sha.

L’en-tête se lit à la machine, et reste lisible pour un modèle qui n’a jamais vu le format. La ligne de réponse est générée à partir du type, donc l’agent sait toujours comment répondre. Le mac est un HMAC de l’identifiant et du corps, avec le jeton du siège pour clé.

Promote, demote, down et up

promote change le modèle ou l’effort d’un agent, et demote le ramène. Un agent Claude avec le mod change dès sa requête suivante ; sinon, et pour Codex, Drove relance l’agent en reprenant sa session une fois qu’il est au repos. Jamais de relance en plein tour.

drove down enregistre chaque identifiant de session et arrête le run. drove up le reprend, et drove up --seat relance un seul siège tombé.

04les règles

Des règles que Drove impose,
plutôt que de les demander.

Chaque règle est une garde, une vérification ou un refus dans le code, pas une ligne dans un prompt.

  1. 01Le planificateur ne modifie pas le code et ne lance pas de build.

    Un hook de garde l’en empêche : modifications hors d’un dossier de brouillon, commandes qui écrivent des fichiers, runtimes, installations de paquets, écritures par gh ou curl. Git en lecture reste permis, pour qu’il puisse lire chaque diff et fusionner.

  2. 02Les agents ne poussent jamais, et personne ne pousse sur production.

    La garde d’un agent refuse tout git push, pour Claude comme pour Codex, que Codex tourne ou non dans son bac à sable. Le planificateur peut pousser, mais jamais sur une branche production.

  3. 03Au plus cinq volets d’agents.

    Un sixième demande le oui de l’humain : drove budget 6, ou une boîte de dialogue dans le mod. La garde refuse drove budget à tous les agents, donc aucun agent ne peut relever sa propre limite.

  4. 04Drove ne répond jamais à une boîte de dialogue d’un agent.

    Une demande de confiance pour un dossier, une revue de hooks, une offre de mise à jour : Drove lit l’écran, nomme la boîte de dialogue et la met au tableau pour l’humain. Une mauvaise réponse à la boîte de sortie de Claude supprime un worktree et ses commits ; c’est pourquoi un siège Claude se ferme avec son volet, jamais avec /exit.

  5. 05Votre configuration n’est pas à Drove.

    Drove ne modifie jamais ~/.claude, ~/.codex ni ~/.tmux.conf, et n’écrit jamais AGENTS.md ni CLAUDE.md dans un dépôt. Permissions, hooks, serveurs MCP et texte de rôle sont fixés à chaque lancement, à partir de fichiers sous ~/.drove.

  6. 06Une tâche Cairn par agent. Drove n’a pas de file.

    Le travail, ce sont des tâches Cairn, et chaque agent est lancé avec exactement une référence. Cairn est la file : rien dans Drove ne peut s’en désynchroniser.

  7. 07Les messages du planificateur sont signés.

    Chaque message porte un MAC dont la clé est le jeton du siège, frappé à neuf à chaque lancement. Un agent Claude avec le mod marque comme non vérifié un message qui échoue au contrôle, et n’applique un promote que s’il est vérifié. Le hook d’un agent Codex affiche un avertissement pour un message qui échoue au contrôle, sans le bloquer. Le jeton n’est pas une frontière contre l’agent lui-même : ce sont les permissions de fichiers qui le sont, ~/.drove en 700 et les jetons en 600.

05le mod

Claude Code avec le mod : une commande.
/orchestrate fait de la session le planificateur.

Le mod est l’une des trois façons de lancer un planificateur ; le planificateur peut aussi être Claude Code sans lui, ou Codex. Avec le mod d’orchestration de Drove chargé, taper /orchestrate et un objectif dans une session Claude Code, à l’intérieur d’un volet herdr, fait de cette session le planificateur. Elle reçoit les outils spawn_worker, message_worker, review_verdict, promote_worker, demote_worker, close_worker et roster, et un tableau et un pont de réveil tournent dans Claude. Retaper /orchestrate dans la même session se rattache au run.

Avec le mod
# in a herdr pane, with Drove's mod/# in CLAUDE_CODE_PLUGIN_DIRSclaude/orchestrate <goal>

Le mod est une couche fine. L’environnement des plugins de Claude Code n’a pas Node, donc le mod ne peut pas importer le code de Drove : il pilote Drove par sa CLI, et ses outils appellent les mêmes fonctions que la CLI et le serveur MCP. Ce qui reste dans le mod, c’est ce que seul Claude sait faire :

  • Changer de modèle et d’effort à chaque requête, pour le planificateur et pour un agent Claude.
  • Le tableau dans Claude, avec ses pastilles et ses notifications.
  • La boîte de dialogue qui vous demande un sixième volet.
  • Les questions d’un agent Claude, son état de permissions, son contexte utilisé et son activité, écrits pour que le planificateur les voie.

Sans le mod, n’importe quel volet herdr peut lancer un planificateur, Claude Code ou Codex. drove plan crée un run, enregistre le volet comme celui du planificateur et se remplace par claude ou codex, avec le serveur MCP de Drove, ses hooks de garde et son texte de rôle. Un planificateur Claude est réveillé par un canal (en préversion de recherche dans Claude Code) ou par frappes clavier ; un planificateur Codex l’est par codex queue, et on lui demande un sixième volet par élicitation MCP.

Sans le mod
# Claude Code; add --goal "..." for a    first instructiondrove plan --kind claude# or Codexdrove plan --kind codex# in a spare pane: live seats, states    and what needs a humandrove board

06état

Ce qu’on a vu marcher,
et où ça s’arrête.

Drove en est à la v1, et il est jeune. Sa conception marque chaque affirmation : vue en fonctionnement, écrite dans la documentation mais pas encore lancée, ou hypothèse à vérifier. Cette page liste ce qu’on a vu marcher, et les limites connues à ce jour.

Vu en fonctionnementen vrai run, dans le mod, ou en spike
  • Un planificateur Codex qui lance un agent Claude et le mène jusqu’à un rapport
  • Des agents Claude dans leurs worktrees par claude --worktree, sans demande de confiance pour le dossier
  • Des briefs livrés par herdr agent prompt une fois l’agent prêt
  • Des messages à un agent Codex par codex queue, y compris en plein tour
  • Un planificateur Codex réveillé par codex queue
  • Le changement de modèle et d’effort à chaque requête dans un agent Claude, par le mod
  • Un planificateur Codex qui mène des agents Codex, réveillé par codex queue, et qui relit et fusionne leur travail
  • La boîte de dialogue du sixième volet, par le mod dans Claude et par une demande MCP dans Codex
  • Deux runs en même temps avec le même nom de siège, chacun ne touchant que son propre agent
  • Un planificateur Claude sans le mod, réveillé par un canal alors qu’il est inactif
  • La signature des messages : un promote falsifié est signalé chez un agent Claude et chez un agent Codex

Limites connues

  • La ligne de lancement de Codex dépasse encore 1024 octets. macOS coupe une ligne tapée à 1024 octets tant que le shell ne lit pas l’entrée, donc Drove raccourcit la ligne et attend une invite stable avant de taper. Un shell qui affiche son invite avant la fin de son initialisation pourrait encore déjouer l’attente. La correction, c’est un CODEX_HOME propre à Drove.
  • Un agent Claude peut partir sans votre travail non poussé. Claude crée son worktree depuis origin/main et Drove ne peut pas fixer la base, donc le travail fusionné en local mais pas poussé manque. Poussez, ou lancez git merge --ff-only main dans le worktree de l’agent. Les agents Codex partent de la base du run.
  • Codex peut demander une fois d’approuver les hooks de Drove. Drove ne répond jamais à cette boîte de dialogue ; il l’affiche au tableau.
  • Le mod a besoin de Node dans le chemin. Il lance la CLI de Drove, donc Node 22.18 ou plus récent doit être dans le PATH, ou indiqué dans le nodePath du mod.
  • Claude affiche une ligne cosmétique au lancement avec le canal. Un planificateur lancé avec un canal affiche no MCP server configured with that name. Le canal fonctionne malgré tout ; la ligne n’est que du bruit. Les canaux sont une préversion de recherche dans Claude Code.

07open source

Open source,
bientôt.

Le dépôt de Drove est privé pour l’instant et n’a pas encore de licence. Il sera publié ; d’ici là, il n’y a rien à cloner, et cette page ne pointe vers aucun dépôt plutôt que vers une page qui répond 404.

Ce qu’il lui faudra

  • Node 22.18 ou plus récent. Drove exécute son TypeScript directement, donc il n’y a pas d’étape de build.
  • herdr 0.9 ou plus récent. Le planificateur tourne dans un volet herdr.
  • claude, codex, ou les deux, dans le PATH.
  • Cairn pour les tâches. Chaque agent est lancé avec une référence Cairn.

De quoi il est fait

Du TypeScript exécuté directement par Node, en modules ES, sans aucune dépendance à l’exécution, avec des tests sur node:test. Un seul binaire, drove, dont les outils MCP appellent les mêmes fonctions que ses commandes.