Écrits

Réserver un fichier avant de l’écrire

Faire travailler plusieurs agents dans un même dossier sans coordination conduit à des écrasements immédiats. Attribuer des copies de travail séparées brise la visibilité mutuelle. La solution opérationnelle réside dans un système de baux sur les chemins, garanti par le serveur, n’autorisant qu’un seul détenteur à la fois.

Donnez à trois agents le même dépôt sans coordination et ils s’écraseront mutuellement en moins d’une minute. La dernière écriture prévaut silencieusement jusqu’à ce que les tests échouent. La réponse habituelle consiste à isoler chaque agent dans son propre worktree, mais cette solution s’avère inadaptée pour construire une application à plusieurs.

Two agents reach for the same file. One reservation is granted; the other is refused at the board.the boardclaude-1codex-2src/types/order.tsrefused
Un détenteur par chemin. L’écriture en conflit est stoppée au niveau du tableau de réservation avant d’atteindre le disque.

Le coût réel de l’isolation par branches

Un worktree par agent fonctionne pour traiter des bugs indépendants sur une base de code mature. Pour créer une application complète en parallèle, l’isolation échoue sur quatre aspects majeurs :

Le deuxième agent ne voit pas le code du premier. L’agent écrivant l’API a besoin d’un type créé une minute plus tôt par l’agent en charge du schéma dans une autre branche. Ne le voyant pas, il le redéfinit, créant des divergences insolubles lors de la fusion.

Sur un projet neuf, les conflits sont maximaux sur les fichiers de configuration partagés (package.json, tsconfig, lockfile).

L’aperçu en direct devient fragmenté : il ne peut afficher qu’un tiers de l’application ou une branche d’intégration en retard.

Enfin, la résolution des conflits nécessite l’intervention humaine ou un modèle supplémentaire consommant inutilement des jetons.

Un bail temporaire plutôt qu’un verrou bloquant

Les agents partagent donc un dossier unique, sécurisé par un système de réservation. Une demande de réservation comprend une liste de chemins, un identifiant d’agent et une durée de validité.

Deux modes existent : exclusif (un seul détenteur pour écriture) et partagé (déclaration de lecture et notification en cas de modification).

export interface ClaimDenial {
  path: string;
  holder: string;
  holderTask: string;
  expiresInS: number;
  hint: string;
}

Une demande refusée ne bloque jamais le processus. Elle renvoie immédiatement les informations sur le détenteur actuel et sa tâche, permettant à l’agent de se réorienter ou de patienter intelligemment sans gaspiller de jetons.

Le bail (15 minutes par défaut) se renouvelle automatiquement à chaque écriture effective de l’agent. En cas d’arrêt du processus, tous ses baux sont instantanément libérés par le serveur.

La conformité est une optimisation, jamais une condition de validité.

Le serveur arbitre et surveille le système de fichiers

Le serveur contrôle directement le système de fichiers. Un observateur analyse chaque écriture sur le disque et vérifie son appartenance :

classifyWrite(rawPath: string, hintedAgentId?: string): WriteClassification

Si une écriture non autorisée survient, un instantané (snapshot) est enregistré avant que la modification n’apparaisse à l’écran, garantissant la possibilité d’un retour en arrière fiable.

L’agent fautif est immédiatement sommé de s’arrêter et le détenteur légitime est invité à recharger son fichier. Au troisième avertissement, l’arbitrage est soumis à l’utilisateur humain.

Attribution automatique des modifications

Grâce au suivi précis des baux au moment de chaque écriture, les messages de commit git associent automatiquement chaque modification à l’agent responsable, offrant un historique clair et détaillé sur une branche unique.

L’architecture globale est détaillée dans plusieurs agents IA sur un même dépôt, et la gestion des terminaux distants dans observer un terminal distant.

Réponses directes

Plusieurs agents IA peuvent-ils travailler dans un même dépôt simultanément ?

Oui, si un mécanisme arbitre les écritures. Sur Murmell, un agent réserve les chemins qu’il s’apprête à modifier et le serveur refuse tout autre accès jusqu’à la libération.

Pourquoi ne pas donner à chaque agent sa propre copie de travail (worktree) ?

Les worktrees séparés empêchent un agent de voir ce qu’un autre vient de créer, menant à des redéfinitions de types et des conflits majeurs lors du merge sur les fichiers générés.

La règle de réservation est-elle suggérée ou imposée ?

Elle est imposée par notre serveur, et non simplement suggérée dans un prompt qu’un modèle pourrait ignorer.