Boucles de coordination — révision et idéation entre plusieurs agents
Motifs de délégation multi-tours : comment brainclaw pilote les cycles de révision et de correction entre deux agents et exécute des boucles d'idéation où un agent critique un autre. Construit sur bclaw_coordinate + bclaw_loop.
La plupart des coordinations sont ponctuelles : on assigne un périmètre, l’agent travaille, l’agent livre. Mais deux motifs nécessitent une délégation multi-tours — où le travail rebondit de manière répétée jusqu’à convergence :
- Boucle de révision — l’auteur écrit, le réviseur critique, l’auteur corrige, le réviseur revérifie. Chaque tour peut appliquer des modifications (mode symétrique) ou seul l’auteur peut (mode asymétrique).
- Boucle d’idéation — le champion propose, le critique remet en question, le champion répond. Itère jusqu’à ce qu’une condition de sortie soit atteinte (consensus, max-itérations, limite de temps).
Les deux fonctionnent sur la même machinerie : bclaw_coordinate(intent=…) ouvre la boucle et déclenche le premier tour ; bclaw_loop(intent=…) pilote les tours suivants depuis le slot assigné.
Boucle de révision
La structure — claude-code est l’auteur, codex est le réviseur :
# L'auteur ouvre la révision (crée un candidat + ouvre une boucle)
bclaw_coordinate intent=review \
open_loop=true \
review_mode=symmetric \
targetAgents=[codex] \
task="Review the JWT refactor in src/auth/" \
scope="src/auth/"
# → candidat cnd_abc, boucle lop_xyz, tour assigné à codex (slot=reviewer)
La session de Codex voit une review_request dans sa boîte de réception. Après avoir lu le diff :
# Tour du réviseur — soumettre les conclusions
bclaw_loop intent=complete_turn \
loop_id=lop_xyz \
artifacts=[{kind: "review_findings", body: "..."}]
# → tour fermé, prochain tour assigné à claude-code (slot=author) pour les corrections
Claude-code applique les corrections sur la même branche, puis pilote le tour suivant :
bclaw_loop intent=turn loop_id=lop_xyz
# → tour assigné : lire les conclusions, appliquer les corrections
bclaw_loop intent=complete_turn loop_id=lop_xyz \
artifacts=[{kind: "fix_summary", body: "..."}]
# → la boucle converge ou est renvoyée au réviseur
Lorsque le réviseur dit LGTM :
bclaw_loop intent=close loop_id=lop_xyz verdict=approved
# → candidat accepté, boucle fermée, changement prêt à être fusionné
review_mode — symétrique vs asymétrique
| Mode | Tour du réviseur | Tour de l’auteur | Cas d’utilisation |
|---|---|---|---|
asymmetric (default) | lit le diff, écrit les conclusions | applique toutes les corrections | révision de PR classique |
symmetric | lit le diff, écrit les conclusions ET applique lui-même des corrections symétriques | gère uniquement les corrections non symétriques | révisions de spécifications / docs où le réviseur peut éditer à faible coût |
Le mode symétrique réduit de moitié les allers-retours sur les documents et les changements de configuration — le réviseur corrige les fautes de frappe et les petites inexactitudes en ligne au lieu de les renvoyer.
Boucle d’idéation
bclaw_coordinate intent=ideate \
targetAgents=[gemini, codex] \
task="Should we ship the federation phase 1 in v1.6 or wait for v2?" \
scope="federation"
# → boucle d'idéation avec graine de proposition, déclenche un tour de critique par critiqueur
Chaque critiqueur reçoit un bref filtré par contexte assemblé à partir de la mémoire du projet. Le filtre des critiques est délibérément asymétrique : ils lisent uniquement les catégories adversariales (pièges, mémos de feedback, notes d’exécution, historique de critiques antérieures, décisions connexes) — et non les documents de conception de soutien rédigés par le champion. Cela produit une pression adversariale utile même à partir d’un seul modèle.
Les critiques retournent des artefacts critique. L’avancement de phase de critique → synthesis est conditionnel : ≥3 artefacts de critique sont requis avant que la boucle ne puisse progresser (événement phase_advance_blocked lorsque la condition échoue). Bloc d’itération :
cycle: 1
max_iterations: 3
exit_when:
- consensus # ≥(N-1)/N critiques alignés
- timeout # 24h depuis le dernier tour
- max_iter # cycle == max_iterations
Quel intent utiliser
| Intent | Utilisation |
|---|---|
bclaw_coordinate intent=assign | assignation de travail ponctuelle, pas de boucle |
bclaw_coordinate intent=consult | question asynchrone, pas d’affirmation |
bclaw_coordinate intent=review (open_loop=true) | multi-tours de révision et de correction |
bclaw_coordinate intent=ideate | multi-tours de critique de proposition |
bclaw_loop intent=turn / complete_turn / advance / close | piloter le tour de VOTRE slot dans une boucle ouverte |
bclaw_loop intent=open | anti-pattern — ouvre une boucle sans déclencher, rien ne s’exécute |
Anti-pattern : ne jamais appeler bclaw_loop intent=open directement. Cela crée la structure de la boucle sans déclenchement, de sorte que le réviseur/critique ne reçoit jamais de tour. Ouvrez toujours via bclaw_coordinate(intent=review|ideate, open_loop=true) afin que le déclenchement ait lieu simultanément.
Voir parallel feature work pour les boucles de révision en production, et la section agent autonomy contract qui lie les transitions définies par protocole comme DOIVENT être exécutées (afin que le réviseur ne s’arrête pas pour demander à l’humain “dois-je envoyer cette réponse ?”).
