Leçon 12 · Collaboration

Chaque agent a son propre arbre de travail.

« Isolate by directory, coordinate by task ID. » Deux plans, sans interférence.

⏱ ~10 min · 📝 3 widgets interactifs · 🧑‍💻 Basé sur shareAI-lab · s12_worktree_task_isolation.py

Le problème des agents parallèles

Les leçons s09–s11 vous permettent de lancer plusieurs teammates en parallèle, mais il y a un piège invisible : ils partagent tous le même répertoire de travail. Alice modifie auth.py, Bob fait de même en même temps — conflits git, fichiers corrompus, tests qui se polluent mutuellement.

La solution de s12 est git worktree : dans un même dépôt, git worktree add permet de checker out différentes branches dans différents répertoires. Chaque agent dispose de son propre worktree, travaille dans son propre répertoire, invisible aux autres.

my-repo/                           # répertoire principal (pour le lead)
.worktrees/
  alice-auth/                      # répertoire isolé d'alice
    (branch: wt/alice-auth)
  bob-api/                         # répertoire isolé de bob
    (branch: wt/bob-api)
  index.json                       # registre des worktrees
  events.jsonl                     # journal des événements du cycle de vie

Deux plans distincts

s12 découpe explicitement le système en deux plans :

  • Plan de contrôle (control plane) : les fichiers JSON dans .tasks/. Une tâche est l'unité abstraite de « ce qu'il faut faire » — avec dépendances, owner, status.
  • Plan d'exécution (execution plane) : les répertoires dans .worktrees/. Un worktree est le conteneur physique de « où le faire » — un répertoire + une branche.

Les deux sont liés bilatéralement via task.worktree et worktree.task_id.

Ce découplage permet de : réutiliser le mécanisme de gestion des tâches en changeant l'environnement d'exécution (par exemple des conteneurs Docker à la place de git worktrees). Ou d'inverser — changer le mécanisme de tâches (base de données plutôt que fichiers JSON) en conservant les worktrees.

Démonstration du cycle de vie

Voici le parcours complet : create task → create worktree → run commands → keep ou remove. Chaque étape est enregistrée dans un journal d'événements (events.jsonl) — en production, c'est lui qui assure l'observabilité.

keep vs remove

Quand un worktree a accompli sa mission, deux issues sont possibles :

  • remove : git worktree remove --force, le répertoire est supprimé. La branche est généralement nettoyée aussi. Équivaut à « cette exploration ne sert à rien ».
  • keep : on marque simplement status: kept dans .worktrees/index.json, le répertoire physique est conservé. Équivaut à « ce résultat est bon, en attente de fusion ».

Schéma courant : un subagent effectue un refactor expérimental → le résultat est satisfaisant → keep → revue humaine → fusion dans la branche principale → suppression manuelle. Résultat décevant ? remove directement.

Interactif

Widget 1 · Lifecycle · de create task à keep/remove

Déclenchez les 5 événements étape par étape. À gauche : état du disque (.tasks/ + .worktrees/), à droite : journal des événements (events.jsonl).

État du disque
events.jsonl (append-only)
Interactif

Widget 2 · Parallel Lanes · 3 agents dans 3 worktrees en parallèle

alice / bob / charlie modifient le même fichier dans des worktrees différents. Se voient-ils ? Y a-t-il des conflits ?

📂 .worktrees/alice/
📂 .worktrees/bob/
📂 .worktrees/charlie/
Interactif

Widget 3 · Decision Flow · choisir la bonne étape suivante

En production, quand un agent termine son travail dans un worktree, faut-il choisir keep ou remove ? 5 scénarios.

Correct : 0 / 5