---
title: Ne soyez pas le meat proxy de votre équipe
description: À l’OpenAI DevDay, Peter Steinberger (OpenClaw) a fait du « meat proxy » non plus une insulte mais un problème d’équipe. Si les agents tournent sur vos machines, vos collègues ne les joignent que par vous. Sa solution : un serveur partagé où chacun peut lire et prompter la session d’agent de n’importe qui.
date: 2026-10-08
tags: agents IA, OpenClaw, Codex, multijoueur, revue de code
---

Quand vos agents tournent sur vos machines, votre équipe ne peut les joindre qu’en passant par vous. Peter Steinberger, le créateur d’OpenClaw, qui travaille aujourd’hui sur les agents chez OpenAI, appelle ça être un meat proxy, un proxy en chair et en os. À l’OpenAI DevDay, il a présenté sa solution : déplacer les sessions d’agents sur un serveur d’équipe partagé, où chacun peut lire, prompter ou reprendre la session de n’importe qui.

Les deux dernières conférences que j’ai résumées portaient sur les agents eux-mêmes : l’[usine logicielle](/fr/notes/software-factory-2022-to-lights-off.html) de Dex Horthy et les [collègues IA dans Slack](/fr/notes/ai-coworkers-slack-agent-identity.html) de MintMCP. Celle de Peter porte sur les gens autour. Dans son équipe, tout le monde avait des agents. Ils ne travaillaient pas ensemble pour autant.

## Ajouter des machines n’a rien réglé

Il commence par raconter comment son installation a grossi cette année. D’abord le terminal : écran divisé, des tas de sessions Codex, un doigt sur la touche Échap pour recadrer. Les modèles se sont améliorés, il a moins eu à recadrer, alors il est passé à l’app de bureau Codex, où lancer beaucoup de sessions à la fois est plus simple. Puis son portable a manqué de disque et ses ventilateurs « faisaient un bruit de réacteur d’avion », alors il a réparti le travail sur six à dix machines : des devboxes, plus des machines dans le cloud qui lancent les tests.

<figure class="fd-fig mp-grow" aria-labelledby="mp2-cap" data-desc="L’installation de Peter au fil de l’année, en trois étapes. D’abord le terminal : écran divisé, des tas de sessions Codex, un doigt sur Échap pour recadrer. Puis l’app de bureau Codex, où lancer beaucoup de sessions à la fois est plus simple. Puis six à dix machines : des devboxes, plus des machines cloud qui lancent les tests. Chaque étape ajoute de la puissance de calcul, et dans les trois cas ses collègues passent toujours par lui pour joindre les agents.">
<ol class="mp-trio">
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 140" aria-hidden="true">
<g class="mp-mates"><circle cx="24" cy="14" r="8"/><circle cx="60" cy="14" r="8"/><circle cx="96" cy="14" r="8"/></g>
<path class="mp-thin" d="M29,21 L52,44"/><path class="mp-thin" d="M60,22 L60,44"/><path class="mp-thin" d="M91,21 L68,44"/>
<g class="fd-box fd-you"><rect x="36" y="44" width="48" height="20"/><text class="mp-you-t" x="60" y="58" text-anchor="middle">Peter</text></g>
<path class="mp-thin mp-thin-agent" d="M60,64 L60,80"/>
<g class="fd-token"><rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-0.0s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M24,14 L50,42"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-1.2s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M60,14 L60,40"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-2.4s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M96,14 L70,42"/></rect></g>
<rect class="mp-w" x="12" y="82" width="96" height="54"/><rect class="mp-wbar" x="12" y="82" width="96" height="7"/>
<path class="mp-thin" d="M60,89 L60,136 M12,112 L108,112"/>
<rect class="mp-ln" x="16" y="95" width="30" height="3"/><rect class="mp-ln" x="16" y="101" width="20" height="3"/><rect class="mp-cur mp-cur-0" x="38" y="100" width="4" height="6"/>
<rect class="mp-ln" x="64" y="95" width="30" height="3"/><rect class="mp-ln" x="64" y="101" width="20" height="3"/><rect class="mp-cur mp-cur-1" x="86" y="100" width="4" height="6"/>
<rect class="mp-ln" x="16" y="117" width="30" height="3"/><rect class="mp-ln" x="16" y="123" width="20" height="3"/><rect class="mp-cur mp-cur-2" x="38" y="122" width="4" height="6"/>
<rect class="mp-ln" x="64" y="117" width="30" height="3"/><rect class="mp-ln" x="64" y="123" width="20" height="3"/><rect class="mp-cur mp-cur-3" x="86" y="122" width="4" height="6"/>
</svg>
<p class="mp-trio-n"><b>1</b>Terminal</p>
<p class="mp-trio-what">Écran divisé, des tas de sessions Codex, un doigt sur Échap pour recadrer</p>
</li>
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 140" aria-hidden="true">
<g class="mp-mates"><circle cx="24" cy="14" r="8"/><circle cx="60" cy="14" r="8"/><circle cx="96" cy="14" r="8"/></g>
<path class="mp-thin" d="M29,21 L52,44"/><path class="mp-thin" d="M60,22 L60,44"/><path class="mp-thin" d="M91,21 L68,44"/>
<g class="fd-box fd-you"><rect x="36" y="44" width="48" height="20"/><text class="mp-you-t" x="60" y="58" text-anchor="middle">Peter</text></g>
<path class="mp-thin mp-thin-agent" d="M60,64 L60,80"/>
<g class="fd-token"><rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-0.4s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M24,14 L50,42"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-1.6s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M60,14 L60,40"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-2.8s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M96,14 L70,42"/></rect></g>
<rect class="mp-w" x="8" y="82" width="104" height="54"/><rect class="mp-wbar" x="8" y="82" width="104" height="7"/>
<rect class="mp-wside" x="8" y="89" width="18" height="47"/>
<rect class="mp-tile mp-tile-0" x="31" y="94" width="23" height="17"/>
<rect class="mp-tile mp-tile-1" x="58" y="94" width="23" height="17"/>
<rect class="mp-tile mp-tile-2" x="85" y="94" width="23" height="17"/>
<rect class="mp-tile mp-tile-3" x="31" y="115" width="23" height="17"/>
<rect class="mp-tile mp-tile-4" x="58" y="115" width="23" height="17"/>
<rect class="mp-tile mp-tile-5" x="85" y="115" width="23" height="17"/>
</svg>
<p class="mp-trio-n"><b>2</b>App Codex</p>
<p class="mp-trio-what">Beaucoup de sessions à la fois, plus simples à lancer</p>
</li>
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 140" aria-hidden="true">
<g class="mp-mates"><circle cx="24" cy="14" r="8"/><circle cx="60" cy="14" r="8"/><circle cx="96" cy="14" r="8"/></g>
<path class="mp-thin" d="M29,21 L52,44"/><path class="mp-thin" d="M60,22 L60,44"/><path class="mp-thin" d="M91,21 L68,44"/>
<g class="fd-box fd-you"><rect x="36" y="44" width="48" height="20"/><text class="mp-you-t" x="60" y="58" text-anchor="middle">Peter</text></g>
<path class="mp-thin mp-thin-agent" d="M60,64 L60,80"/>
<g class="fd-token"><rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-0.8s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M24,14 L50,42"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-2.0s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M60,14 L60,40"/></rect>
<rect x="-3" y="-3" width="6" height="6"><animateMotion dur="3.6s" begin="-3.2s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear" path="M96,14 L70,42"/></rect></g>
<g class="mp-mach"><rect x="9" y="82" width="24" height="24"/><circle class="mp-led mp-led-0" cx="13" cy="86" r="1.6"/><g class="mp-fan"><path d="M22,90 L22,102 M16,96 L28,96"/></g></g>
<g class="mp-mach"><rect x="35" y="82" width="24" height="24"/><circle class="mp-led mp-led-1" cx="39" cy="86" r="1.6"/><g class="mp-fan"><path d="M48,90 L48,102 M42,96 L54,96"/></g></g>
<g class="mp-mach"><rect x="61" y="82" width="24" height="24"/><circle class="mp-led mp-led-2" cx="65" cy="86" r="1.6"/><g class="mp-fan"><path d="M74,90 L74,102 M68,96 L80,96"/></g></g>
<g class="mp-mach"><rect x="87" y="82" width="24" height="24"/><circle class="mp-led mp-led-3" cx="91" cy="86" r="1.6"/><g class="mp-fan"><path d="M100,90 L100,102 M94,96 L106,96"/></g></g>
<g class="mp-mach"><rect x="9" y="110" width="24" height="24"/><circle class="mp-led mp-led-0" cx="13" cy="114" r="1.6"/><g class="mp-fan"><path d="M22,118 L22,130 M16,124 L28,124"/></g></g>
<g class="mp-mach"><rect x="35" y="110" width="24" height="24"/><circle class="mp-led mp-led-1" cx="39" cy="114" r="1.6"/><g class="mp-fan"><path d="M48,118 L48,130 M42,124 L54,124"/></g></g>
<g class="mp-mach"><rect x="61" y="110" width="24" height="24"/><circle class="mp-led mp-led-2" cx="65" cy="114" r="1.6"/><g class="mp-fan"><path d="M74,118 L74,130 M68,124 L80,124"/></g></g>
<g class="mp-mach"><rect x="87" y="110" width="24" height="24"/><circle class="mp-led mp-led-3" cx="91" cy="114" r="1.6"/><g class="mp-fan"><path d="M100,118 L100,130 M94,124 L106,124"/></g></g>
</svg>
<p class="mp-trio-n"><b>3</b>6 à 10 machines</p>
<p class="mp-trio-what">Des devboxes, plus des machines cloud pour les tests</p>
</li>
</ol>
<p class="mp-strip"><b>À chaque fois</b><span>Plus de calcul en bas. Toujours la même personne entre ses collègues et les agents.</span></p>
<figcaption id="mp2-cap">Son année, telle qu’il la raconte en début de conférence. En haut de chaque installation : ses collègues, puis lui. En bas : les machines.</figcaption>
</figure>

Rien de tout ça n’a réglé le vrai goulot d’étranglement :

> Quand mes collègues voulaient s’impliquer, ils devaient toujours passer par moi. Vous voyez, on travaillait tous avec des agents, mais on ne travaillait pas vraiment ensemble.


<figure class="fd-fig mp-fig" aria-labelledby="mp1-cap">
<input class="fd-radio" type="radio" name="mp1" id="mp1-proxy" checked>
<input class="fd-radio" type="radio" name="mp1" id="mp1-server">
<div class="fd-tabs"><label for="mp1-proxy">Par vous</label><label for="mp1-server">Serveur d’équipe</label></div>
<div class="fd-canvas">
<svg viewBox="0 0 440 382" role="img" aria-labelledby="mp1-title mp1-desc">
<title id="mp1-title">Où vivent les sessions d’agents</title>
<desc id="mp1-desc">Par vous : six collègues joignent tous les sessions d’agents par une seule personne, qui les fait tourner sur ses propres machines et relaie chaque demande et chaque réponse. Serveur d’équipe : les sessions vivent sur un serveur partagé, et chaque collègue, vous compris, lit et prompte directement n’importe quelle session.</desc>
<defs>
<marker id="mp1-head" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="8" markerHeight="8" orient="auto-start-reverse"><path class="fd-head" d="M0,0 L8,4 L0,8 Z"/></marker>
<marker id="mp1-head-c" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="8" markerHeight="8" orient="auto-start-reverse"><path class="fd-head-c" d="M0,0 L8,4 L0,8 Z"/></marker>
<path id="mp1-p1" d="M40,61 L182,140 L220,180 L95,240"/>
<path id="mp1-p2" d="M160,61 L212,140 L220,180 L220,240"/>
<path id="mp1-p3" d="M400,61 L258,140 L220,180 L345,240"/>
<path id="mp1-s1" d="M40,61 L110,240"/>
<path id="mp1-s2" d="M220,61 L330,240"/>
<path id="mp1-s3" d="M280,61 L240,240"/>
<path id="mp1-s4" d="M160,61 L125,240"/>
</defs>
<g class="fd-stage mp-in-proxy">
<g class="fd-box-dim"><rect x="4" y="206" width="432" height="170"/></g>
<text class="fd-label" x="14" y="364">VOS MACHINES</text>
<path class="fd-line" d="M40,61 L182,140" marker-end="url(#mp1-head)"/>
<path class="fd-line" d="M100,61 L197,140" marker-end="url(#mp1-head)"/>
<path class="fd-line" d="M160,61 L212,140" marker-end="url(#mp1-head)"/>
<path class="fd-line" d="M280,61 L228,140" marker-end="url(#mp1-head)"/>
<path class="fd-line" d="M340,61 L243,140" marker-end="url(#mp1-head)"/>
<path class="fd-line" d="M400,61 L258,140" marker-end="url(#mp1-head)"/>
<path class="fd-line fd-line-agent" d="M220,180 L95,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M220,180 L220,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M220,180 L345,240" marker-end="url(#mp1-head-c)"/>
<text class="fd-note" x="8" y="122">chaque demande</text><text class="fd-note" x="8" y="137">passe par vous</text>
<text class="fd-note" x="432" y="122" text-anchor="end">chaque réponse</text><text class="fd-note" x="432" y="137" text-anchor="end">revient aussi</text>
<g class="fd-box fd-you"><rect x="170" y="140" width="100" height="40"/><text class="fd-t" x="220" y="165" text-anchor="middle">Vous</text></g>
</g>
<g class="fd-stage mp-in-server">
<rect class="mp-server" x="4" y="206" width="432" height="170"/>
<text class="fd-label" x="14" y="364">SERVEUR D’ÉQUIPE</text>
<path class="fd-line fd-line-agent" d="M40,61 L110,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M100,61 L200,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M160,61 L125,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M220,61 L330,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M280,61 L240,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M340,61 L400,240" marker-end="url(#mp1-head-c)"/>
<path class="fd-line fd-line-agent" d="M400,61 L270,240" marker-end="url(#mp1-head-c)"/>
<g class="mp-mate mp-mate-you"><circle cx="220" cy="44" r="17"/><circle class="mp-icon" cx="220" cy="39" r="4.5"/><path class="mp-icon" d="M212,54 Q220,43 228,54 Z"/></g>
<text class="fd-note" x="220" y="20" text-anchor="middle">vous</text>
</g>
<g class="mp-mate"><circle cx="40" cy="44" r="17"/><circle class="mp-icon" cx="40" cy="39" r="4.5"/><path class="mp-icon" d="M32,54 Q40,43 48,54 Z"/></g>
<g class="mp-mate"><circle cx="100" cy="44" r="17"/><circle class="mp-icon" cx="100" cy="39" r="4.5"/><path class="mp-icon" d="M92,54 Q100,43 108,54 Z"/></g>
<g class="mp-mate"><circle cx="160" cy="44" r="17"/><circle class="mp-icon" cx="160" cy="39" r="4.5"/><path class="mp-icon" d="M152,54 Q160,43 168,54 Z"/></g>
<g class="mp-mate"><circle cx="280" cy="44" r="17"/><circle class="mp-icon" cx="280" cy="39" r="4.5"/><path class="mp-icon" d="M272,54 Q280,43 288,54 Z"/></g>
<g class="mp-mate"><circle cx="340" cy="44" r="17"/><circle class="mp-icon" cx="340" cy="39" r="4.5"/><path class="mp-icon" d="M332,54 Q340,43 348,54 Z"/></g>
<g class="mp-mate"><circle cx="400" cy="44" r="17"/><circle class="mp-icon" cx="400" cy="39" r="4.5"/><path class="mp-icon" d="M392,54 Q400,43 408,54 Z"/></g>
<g class="mp-win"><rect x="10" y="240" width="130" height="104"/><path class="fd-rule" d="M10,256 H140"/><circle cx="20" cy="248" r="2.2"/><circle cx="28" cy="248" r="2.2"/><circle cx="36" cy="248" r="2.2"/><circle class="on" cx="26" cy="271" r="5"/><rect class="mp-bar" x="38" y="268" width="88" height="6"/><circle cx="26" cy="290" r="5"/><rect class="mp-bar" x="38" y="287" width="64" height="6"/><circle class="on" cx="26" cy="309" r="5"/><rect class="mp-bar" x="38" y="306" width="80" height="6"/><circle cx="26" cy="328" r="5"/><rect class="mp-bar" x="38" y="325" width="56" height="6"/></g>
<g class="mp-win"><rect x="155" y="240" width="130" height="104"/><path class="fd-rule" d="M155,256 H285"/><circle cx="165" cy="248" r="2.2"/><circle cx="173" cy="248" r="2.2"/><circle cx="181" cy="248" r="2.2"/><circle cx="171" cy="271" r="5"/><rect class="mp-bar" x="183" y="268" width="88" height="6"/><circle class="on" cx="171" cy="290" r="5"/><rect class="mp-bar" x="183" y="287" width="64" height="6"/><circle cx="171" cy="309" r="5"/><rect class="mp-bar" x="183" y="306" width="80" height="6"/><circle cx="171" cy="328" r="5"/><rect class="mp-bar" x="183" y="325" width="56" height="6"/></g>
<g class="mp-win"><rect x="300" y="240" width="130" height="104"/><path class="fd-rule" d="M300,256 H430"/><circle cx="310" cy="248" r="2.2"/><circle cx="318" cy="248" r="2.2"/><circle cx="326" cy="248" r="2.2"/><circle class="on" cx="316" cy="271" r="5"/><rect class="mp-bar" x="328" y="268" width="88" height="6"/><circle cx="316" cy="290" r="5"/><rect class="mp-bar" x="328" y="287" width="64" height="6"/><circle cx="316" cy="309" r="5"/><rect class="mp-bar" x="328" y="306" width="80" height="6"/><circle class="on" cx="316" cy="328" r="5"/><rect class="mp-bar" x="328" y="325" width="56" height="6"/></g>
<g class="fd-token fd-token-ui fd-stage mp-in-proxy">
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="9s" begin="-0s" repeatCount="indefinite" calcMode="linear" keyPoints="0;0.456;0.456;1;1" keyTimes="0;0.15;0.6;0.9;1"><mpath href="#mp1-p1"/></animateMotion></rect>
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="9s" begin="-3s" repeatCount="indefinite" calcMode="linear" keyPoints="0;0.484;0.484;1;1" keyTimes="0;0.15;0.6;0.9;1"><mpath href="#mp1-p2"/></animateMotion></rect>
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="9s" begin="-6s" repeatCount="indefinite" calcMode="linear" keyPoints="0;0.456;0.456;1;1" keyTimes="0;0.15;0.6;0.9;1"><mpath href="#mp1-p3"/></animateMotion></rect>
</g>
<g class="fd-token fd-token-ui fd-stage mp-in-server">
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="2.4s" begin="-0.0s" repeatCount="indefinite"><mpath href="#mp1-s1"/></animateMotion></rect>
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="2.4s" begin="-0.6s" repeatCount="indefinite"><mpath href="#mp1-s2"/></animateMotion></rect>
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="2.4s" begin="-1.2s" repeatCount="indefinite"><mpath href="#mp1-s3"/></animateMotion></rect>
<rect x="-5" y="-5" width="10" height="10"><animateMotion dur="2.4s" begin="-1.8s" repeatCount="indefinite"><mpath href="#mp1-s4"/></animateMotion></rect>
</g>
</svg>
</div>
<figcaption id="mp1-cap">
<span class="fd-stage mp-in-proxy">Par vous : les agents tournent sur vos machines, donc chaque demande d’un collègue passe par vous et chaque réponse revient par le même chemin. Le meat proxy, c’est ça.</span>
<span class="fd-stage mp-in-server">Serveur d’équipe : les sessions vivent dans un lieu partagé. N’importe qui dans l’équipe lit n’importe quelle session, lui envoie un prompt ou la reprend là où quelqu’un s’est arrêté, et vous n’êtes qu’une place de plus dans la rangée.</span>
<span class="fd-credit">Le premier onglet est redessiné d’après la slide de Peter Steinberger dans <a href="https://www.youtube.com/watch?v=wZYnJfL4c2Y&amp;t=147s" target="_blank" rel="noopener noreferrer">ClawLabs : Building Open Source Together</a>, OpenAI DevDay 2026 ; le second est le serveur d’équipe qu’il a décrit. Changez d’onglet.</span>
</figcaption>
</figure>

## Meat proxy, deuxième sens

Le terme vient de Niklas Gruhn. Son billet d’août, [Don’t be a meat proxy](https://gruhn.me/blog/2026-08-03/), parle de quelqu’un qui colle des réponses d’IA à ses collègues sans les lire, si bien que le collègue aurait aussi bien pu interroger l’IA lui-même. C’est une insulte qui vise une habitude.

Peter l’emploie pour quelque chose de plus large : servir d’interface avec l’IA, faire passer les messages dans un sens puis dans l’autre. Vous pouvez lire chaque mot qu’écrit votre agent et en être un quand même, si les agents n’existent que sur votre portable. C’est ce que cette conférence m’apporte de neuf. Ce n’est pas une question de discipline. C’est une question de lieu : là où vivent les sessions.

<figure class="fd-fig mp-two" aria-labelledby="mp3-cap" data-desc="Deux sens de meat proxy. Celui de Niklas Gruhn est une habitude : la réponse de l’IA passe par quelqu’un qui ne la lit pas, si bien que le collègue aurait aussi bien pu interroger l’IA. Celui de Peter est une question de lieu : vous pouvez lire chaque mot, mais si les agents n’existent que sur votre portable, chaque demande et chaque réponse passent quand même par vous. Ce n’est pas une question de discipline. C’est une question de lieu : là où vivent les sessions.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Niklas Gruhn · août</p>
<p class="mp-two-name">Une habitude</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<defs><marker id="mp3-h" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path class="fd-head" d="M0,0 L8,4 L0,8 Z"/></marker></defs>
<g class="mp-ai"><rect x="4" y="28" width="60" height="36"/><text x="34" y="51" text-anchor="middle">IA</text></g>
<path class="fd-line" d="M64,46 L124,46" marker-end="url(#mp3-h)"/>
<path class="fd-line" d="M172,46 L238,46" marker-end="url(#mp3-h)"/>
<circle class="mp-you-c" cx="150" cy="46" r="22"/>
<path class="mp-eye-shut" d="M139,44 Q150,53 161,44 M142,48 L139.5,52.5 M150,50.5 L150,55.5 M158,48 L160.5,52.5"/>
<g class="mp-mates"><circle cx="262" cy="46" r="18"/></g>
<text class="mp-cap-t" x="34" y="88" text-anchor="middle">sortie IA</text>
<text class="mp-cap-t" x="150" y="88" text-anchor="middle">ne la lit pas</text>
<text class="mp-cap-t" x="262" y="88" text-anchor="middle">collègue</text>
<g class="fd-token fd-token-ui"><rect x="-4" y="-4" width="8" height="8"><animateMotion dur="2.4s" repeatCount="indefinite" path="M66,46 L240,46"/></rect></g>
</svg>
<p class="mp-two-line">La réponse de l’IA transmise sans être lue</p>
<p class="mp-two-line">Le collègue aurait pu interroger l’IA lui-même</p>
</div>
<p class="mp-two-vs" aria-hidden="true">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Peter Steinberger · DevDay</p>
<p class="mp-two-name">Un lieu</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<defs><marker id="mp3-hc" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path class="fd-head" d="M0,0 L8,4 L0,8 Z"/></marker></defs>
<g class="mp-mates"><circle cx="30" cy="46" r="18"/></g>
<path class="fd-line" d="M50,40 L124,40" marker-end="url(#mp3-hc)"/><path class="fd-line" d="M176,40 L218,40" marker-end="url(#mp3-hc)"/>
<path class="fd-line" d="M218,52 L178,52" marker-end="url(#mp3-hc)"/><path class="fd-line" d="M124,52 L52,52" marker-end="url(#mp3-hc)"/>
<circle class="mp-you-c" cx="150" cy="46" r="22"/>
<path class="mp-eye-open" d="M137,46 Q150,33 163,46 Q150,59 137,46 Z"/><circle class="mp-pupil" cx="150" cy="46" r="4.5"/>
<g class="mp-laptop"><rect x="224" y="22" width="70" height="44"/><path d="M218,70 L300,70"/></g>
<rect class="mp-sess-on" x="231" y="30" width="16" height="12"/><rect class="mp-sess-on" x="251" y="30" width="16" height="12"/><rect class="mp-sess-on" x="271" y="30" width="16" height="12"/>
<rect class="mp-ln" x="231" y="48" width="40" height="3"/><rect class="mp-ln" x="231" y="55" width="28" height="3"/>
<text class="mp-cap-t" x="30" y="88" text-anchor="middle">collègue</text>
<text class="mp-cap-t" x="150" y="88" text-anchor="middle">lit chaque mot</text>
<text class="mp-cap-t" x="259" y="88" text-anchor="middle">le portable</text>
<g class="fd-token"><rect x="-4" y="-4" width="8" height="8"><animateMotion dur="4.8s" repeatCount="indefinite" keyPoints="0;0.58;0.58;1;1" keyTimes="0;0.2;0.45;0.6;1" calcMode="linear" path="M52,40 L220,40"/></rect></g>
<g class="fd-token fd-token-ui"><rect x="-4" y="-4" width="8" height="8"><animateMotion dur="4.8s" begin="-2.4s" repeatCount="indefinite" keyPoints="0;0.42;0.42;1;1" keyTimes="0;0.15;0.4;0.6;1" calcMode="linear" path="M218,52 L50,52"/></rect></g>
</svg>
<p class="mp-two-line">Vous lisez chaque mot et vous en êtes un quand même</p>
<p class="mp-two-line">Les agents n’existent que sur votre portable</p>
</div>
</div>
<p class="mp-strip"><b>Ce qui change</b><span>Pas une question de discipline : une question de lieu, là où vivent les sessions.</span></p>
<figcaption id="mp3-cap">Les mêmes mots, deux problèmes. Dans les deux cas, le travail passe par une seule personne ; chez Peter, le lire n’y change rien.</figcaption>
</figure>

## Montrez-moi le prompt

Sa première tentative n’était pas un serveur. Une seule phrase peut aujourd’hui produire des dizaines de milliers de lignes de code, mais la conversation qui les a produites reste sur la machine de quelqu’un. Il a relu bon nombre de PR où il comprenait ce qui avait changé, mais pas pourquoi.

Il a donc ajouté une skill qui demandait aux contributeurs de joindre à leur PR une transcription nettoyée. Très peu ont accepté, et il reconnaît qu’il a parfois refusé lui aussi. Montrer comment on parle à son agent a quelque chose d’étonnamment intime.

Quand son équipe a rendu toutes les sessions visibles, ça a été gênant pendant une journée. Ils ont lu les conversations des uns et des autres, en ont un peu ri, puis c’est devenu normal. Aujourd’hui, ils apprennent de la façon dont les autres promptent et repèrent les erreurs plus tôt.

<figure class="fd-fig mp-why-fig" aria-labelledby="mp4-cap" data-desc="Quelle part du pourquoi arrive jusqu’à la personne qui relit, en trois étapes. Le diff seul montre ce qui a changé, pas pourquoi : la conversation reste sur le portable de quelqu’un. Une transcription nettoyée et facultative sur la PR : très peu ont accepté, et Peter a parfois refusé lui aussi. Toutes les sessions visibles par l’équipe : gênant pendant une journée, puis normal, et aujourd’hui ils apprennent de la façon dont les autres promptent et repèrent les erreurs plus tôt.">
<ol class="mp-trio">
<li class="mp-trio-step">
<div class="mp-pr" aria-hidden="true"><p class="mp-pr-h"><b>PR</b><i></i></p><p class="mp-diff"><i class="add"></i><i class="del"></i><i class="add"></i><i class="add"></i></p></div>
<p class="mp-why-plus" aria-hidden="true">+ le pourquoi</p>
<div class="mp-why mp-why-none" aria-hidden="true"><span>reste sur un portable</span></div>
<p class="mp-trio-n"><b>1</b>Le diff seul</p>
<p class="mp-trio-what">Ce qui a changé, pas pourquoi</p>
</li>
<li class="mp-trio-step">
<div class="mp-pr" aria-hidden="true"><p class="mp-pr-h"><b>PR</b><i></i></p><p class="mp-diff"><i class="add"></i><i class="del"></i><i class="add"></i><i class="add"></i></p></div>
<p class="mp-why-plus" aria-hidden="true">+ le pourquoi</p>
<div class="mp-why mp-why-rare" aria-hidden="true"><i></i><i class="x"></i><i></i><i class="x"></i><b>rarement</b></div>
<p class="mp-trio-n"><b>2</b>Transcription facultative</p>
<p class="mp-trio-what">Une transcription nettoyée sur la PR. Très peu ont accepté ; lui-même refusait parfois</p>
</li>
<li class="mp-trio-step">
<div class="mp-pr" aria-hidden="true"><p class="mp-pr-h"><b>PR</b><i></i></p><p class="mp-diff"><i class="add"></i><i class="del"></i><i class="add"></i><i class="add"></i></p></div>
<p class="mp-why-plus" aria-hidden="true">+ le pourquoi</p>
<div class="mp-why mp-why-all" aria-hidden="true"><i class="me"></i><i class="ai"></i><i class="me"></i><i class="ai"></i></div>
<p class="mp-trio-n"><b>3</b>Toutes les sessions visibles</p>
<p class="mp-trio-what">Gênant un jour, puis normal. Ils apprennent des prompts des autres</p>
</li>
</ol>
<figcaption id="mp4-cap">Montrez-moi le prompt : la même PR, avec plus ou moins de la conversation qui l’a produite.</figcaption>
</figure>

La démo convainc mieux que les slides. Il se réveille devant une PR où Victor, un collègue, a réduit les tableaux, le lendemain du jour où Peter les avait agrandis. L’ancien réflexe aurait été ce qu’il appelle un « message pas très californien ». À la place, il ouvre la session de travail derrière la PR. Victor avait repris la propre session de Peter, l’avait prévenu d’abord, et corrigé ce que Peter avait raté. Crise réglée avant le déjeuner.

<figure class="fd-fig mp-story" aria-labelledby="mp5-cap" data-desc="L’histoire de Victor en six cases. La veille, Peter agrandit les tableaux. Le lendemain matin, il se réveille devant une PR où Victor les a réduits. L’ancien réflexe aurait été un message pas très californien. À la place, il ouvre la session de travail derrière la PR. Victor avait repris la propre session de Peter et l’avait prévenu d’abord. Il avait corrigé ce que Peter avait raté : crise réglée avant le déjeuner.">
<ol class="mp-story-strip" tabindex="0" aria-label="L’histoire de Victor, six cases">
<li class="mp-panel">
<p class="mp-panel-when"><b>1</b>La veille</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><g class="mp-table mp-table-up"><rect x="64" y="22" width="72" height="48"/><path d="M64,37.8 H136 M64,53.9 H136 M88,22 V70 M112,22 V70"/><rect class="mp-table-h" x="64" y="22" width="72" height="15.8"/></g>
<text class="mp-sym" x="166" y="44" text-anchor="middle">+</text><text class="mp-art-t" x="100" y="100" text-anchor="middle">tableaux : plus grands</text></svg>
<p class="mp-panel-say">Peter agrandit les tableaux.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>2</b>Le lendemain matin</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><g class="mp-prbox"><rect x="28" y="8" width="144" height="88"/><rect class="mp-prbox-h" x="28" y="8" width="144" height="18"/></g>
<text class="mp-art-t mp-art-t-inv" x="36" y="21">PR</text><g class="mp-av"><rect x="150" y="11" width="13" height="13"/><text x="156.5" y="21" text-anchor="middle">V</text></g>
<g class="mp-table mp-table-down"><rect x="70" y="40" width="60" height="40"/><path d="M70,53.2 H130 M70,66.6 H130 M90,40 V80 M110,40 V80"/><rect class="mp-table-h" x="70" y="40" width="60" height="13.2"/></g><text class="mp-sym" x="152" y="70" text-anchor="middle">−</text></svg>
<p class="mp-panel-say">Il se réveille devant une PR. Victor a réduit les tableaux.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>3</b>L’ancien réflexe</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><g class="mp-bubble"><path d="M30,14 H170 V70 H70 L52,88 V70 H30 Z"/></g>
<text class="mp-curse" x="100" y="50" text-anchor="middle">#%@&amp;!</text><path class="mp-strike" d="M40,26 L160,62"/>
<text class="mp-art-t" x="100" y="104" text-anchor="middle">jamais envoyé</text></svg>
<p class="mp-panel-say">L’ancien réflexe : un « message pas très californien ».</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>4</b>À la place</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><g class="mp-prbox"><rect x="28" y="8" width="144" height="88"/><rect class="mp-prbox-h" x="28" y="8" width="144" height="18"/></g>
<text class="mp-art-t mp-art-t-inv" x="36" y="21">PR</text><rect class="mp-ln" x="40" y="36" width="90" height="4"/><rect class="mp-ln" x="40" y="46" width="64" height="4"/>
<g class="mp-btn"><rect x="40" y="62" width="120" height="22"/><text x="100" y="77" text-anchor="middle">voir la session ↗</text></g>
<g class="mp-cursor"><path d="M0,0 L0,16 L4.5,12 L8,19 L10.5,18 L7,11 L13,11 Z"/></g></svg>
<p class="mp-panel-say">À la place, il ouvre la session de travail derrière la PR.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>5</b>Dans la session</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><g class="mp-prbox"><rect x="20" y="6" width="160" height="96"/><rect class="mp-prbox-h" x="20" y="6" width="160" height="18"/></g>
<text class="mp-art-t mp-art-t-inv" x="28" y="19">Session de Peter</text>
<g class="mp-av mp-av-p"><rect x="28" y="32" width="12" height="12"/><text x="34" y="41.5" text-anchor="middle">P</text></g><rect class="mp-ln" x="46" y="36" width="80" height="4"/>
<g class="mp-av"><rect x="28" y="52" width="12" height="12"/><text x="34" y="61.5" text-anchor="middle">V</text></g><text class="mp-art-t mp-art-agent" x="46" y="62">a repris la session</text>
<g class="mp-av"><rect x="28" y="72" width="12" height="12"/><text x="34" y="81.5" text-anchor="middle">V</text></g><g class="mp-ping"><rect x="46" y="72" width="16" height="12"/><path d="M46,72 L54,79 L62,72"/></g><text class="mp-art-t mp-art-agent" x="68" y="82">a prévenu Peter</text></svg>
<p class="mp-panel-say">Victor avait repris la propre session de Peter, et l’avait prévenu d’abord.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>6</b>Avant le déjeuner</p>
<svg class="mp-panel-art" viewBox="0 0 200 110" aria-hidden="true"><path class="mp-check" d="M64,52 L88,76 L136,24"/>
<text class="mp-quote" x="100" y="100" text-anchor="middle">« J’avais tort. »</text></svg>
<p class="mp-panel-say">Il avait corrigé ce que Peter avait raté. Crise réglée avant le déjeuner.</p>
</li>
</ol>
<figcaption id="mp5-cap">La démo à 11:46, en six cases. « J’avais tort », c’est Peter, sur scène.<span class="mp-swipe" aria-hidden="true">Balayez pour la case suivante →</span></figcaption>
</figure>

Sa conclusion est sans détour : les pull requests comme façon de collaborer, ça « ne ressemble tout simplement plus à l’avenir ». Sur le serveur d’équipe, chacun voit et prompte la session de n’importe qui, donc la seule règle est de n’inviter que des gens qui peuvent mettre les mains dans vos sessions sans que ça vous gêne. Ensuite, il veut inviter les principaux contributeurs d’OpenClaw : eux reçoivent les tokens, et le projet récupère un peu de leurs idées. « Je trouve que c’est une super affaire. »

## Le serveur est un lieu, pas une app

La barre latérale de ce serveur est pleine de petites apps : les temps de CI, les chiffres de la communauté (PR ouvertes, issues, merges), un journal « daily Claw » écrit à partir de tout ce qui a été mergé, un slopomètre qui pousse sans arrêt les agents à faire le ménage, des rapports d’activité et les réunions. Ils payaient un logiciel de réunion, jusqu’au jour où il s’est dit « ça, c’est un prompt ». Aujourd’hui, l’agent rejoint leurs appels Discord, rédige le compte rendu et peut répondre à voix haute.

Pour lui, un tableau de bord, c’est une session qui génère un artefact, plus une automatisation qui le tient à jour. Vous le voulez en bleu ? Dites-le à l’agent. Ça change si vite qu’il préfère parler de jellyware plutôt que de software. Et comme chaque tableau de bord est une session sur le serveur partagé, n’importe qui dans l’équipe peut le modifier, pas seulement la personne qui l’a construit.

<figure class="fd-fig mp-tour" aria-labelledby="mp6-cap" data-desc="Un schéma de la barre latérale du serveur d’équipe, avec six petites apps : les temps de CI, les chiffres de la communauté (PR ouvertes, issues, merges), le journal Daily Claw écrit à partir de tout ce qui a été mergé, un slopomètre qui pousse sans arrêt les agents à faire le ménage, des rapports d’activité et les réunions, où l’agent rejoint l’appel Discord, rédige le compte rendu et peut répondre à voix haute. Un tableau de bord est une session qui génère un artefact, plus une automatisation qui le tient à jour ; pour en modifier un, vous le dites à l’agent, par exemple de le passer en bleu.">
<input class="fd-radio" type="radio" name="mp6" id="mp6-ci" checked>
<input class="fd-radio" type="radio" name="mp6" id="mp6-com">
<input class="fd-radio" type="radio" name="mp6" id="mp6-claw">
<input class="fd-radio" type="radio" name="mp6" id="mp6-slop">
<input class="fd-radio" type="radio" name="mp6" id="mp6-rep">
<input class="fd-radio" type="radio" name="mp6" id="mp6-meet">
<input class="fd-radio" type="checkbox" id="mp6-blue">
<div class="mp-win">
<div class="mp-win-bar" aria-hidden="true"><i></i><i></i><i></i><span>serveur d’équipe</span></div>
<div class="mp-win-body">
<div class="mp-side"><p class="mp-side-h">Apps</p><label for="mp6-ci">Temps de CI</label><label for="mp6-com">Communauté</label><label for="mp6-claw">Daily Claw</label><label for="mp6-slop">Slopomètre</label><label for="mp6-rep">Rapports</label><label for="mp6-meet">Réunions</label></div>
<div class="mp-pane">
<div class="mp-app mp-app-ci">
<p class="mp-app-h">Temps de CI</p>
<div class="mp-bars" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>
<label class="mp-ask" for="mp6-blue"><span class="mp-ask-you">Dites à l’agent</span><span class="mp-ask-off">« passe-le en bleu »</span><span class="mp-ask-on">« remets-le couleur encre »</span><b aria-hidden="true">↵</b></label>
</div>
<div class="mp-app mp-app-com">
<p class="mp-app-h">Communauté</p>
<div class="mp-counts" aria-hidden="true"><p><span>PR ouvertes</span><i></i><i></i><i></i><i></i><i></i><i></i></p><p><span>Issues</span><i></i><i></i><i></i><i></i><i></i><i></i></p><p><span>Mergées</span><i></i><i></i><i></i><i></i><i></i><i></i></p></div>
<p class="mp-app-note">Les chiffres du projet : PR ouvertes, issues, merges.</p>
</div>
<div class="mp-app mp-app-claw">
<p class="mp-mast">The Daily Claw</p>
<p class="mp-mast-sub">Écrit à partir de ce qui a été mergé</p>
<div class="mp-cols" aria-hidden="true"><p><b></b><i></i><i></i><i></i><i></i></p><p><b></b><i></i><i></i><i></i><i></i></p><p><b></b><i></i><i></i><i></i><i></i></p></div>
</div>
<div class="mp-app mp-app-slop">
<p class="mp-app-h">Slopomètre</p>
<div class="mp-meter" aria-hidden="true"><span>propre</span><i><b></b></i><span>slop</span></div>
<p class="mp-app-note">Pousse sans arrêt les agents à faire le ménage.</p>
</div>
<div class="mp-app mp-app-rep">
<p class="mp-app-h">Rapports</p>
<div class="mp-rows" aria-hidden="true"><p><b></b><i></i></p><p><b></b><i></i></p><p><b></b><i></i></p><p><b></b><i></i></p></div>
<p class="mp-app-note">Activité : qui commite, qui est sur Discord.</p>
</div>
<div class="mp-app mp-app-meet">
<p class="mp-app-h">Réunions <span class="mp-live">en appel</span></p>
<div class="mp-call" aria-hidden="true"><i></i><i></i><i></i><b><s></s><s></s><s></s><s></s><s></s></b></div>
<p class="mp-app-note">L’agent rejoint l’appel Discord, rédige le compte rendu et peut répondre à voix haute.</p>
</div>
</div>
</div>
</div>
<div class="mp-eq-row">
<p class="mp-eq-box">Session</p><p class="mp-eq-op">produit</p><p class="mp-eq-box mp-eq-art">Artefact</p><p class="mp-eq-op">tenu à jour par</p><p class="mp-eq-box">Automatisation</p>
<p class="mp-eq-is"><span>= un tableau de bord.</span> Lui dirait jellyware.</p>
</div>
<figcaption id="mp6-cap">Un schéma de la barre latérale qu’il a fait visiter, pas une capture d’écran. Choisissez une app. Sur Temps de CI, demandez à l’agent de la passer en bleu.</figcaption>
</figure>

Il pense aussi que la CI telle qu’on la pratique n’a plus de sens, et il essaie Codex pour choisir les tests dont un changement a vraiment besoin. Il garde ce sujet pour une autre conférence.

## Boucles, objectifs et goût

Vient ensuite la partie usine. Il fait tourner deux sortes de travaux au long cours :

<figure class="fd-fig mp-lg" aria-labelledby="mp7-cap" data-desc="Deux sortes de travaux au long cours. Une boucle ne se termine jamais, elle vérifie en continu : ses exemples sont le tri des bugs venus de Discord, de X et de GitHub, plus un contrôle de performance sur chaque version quotidienne. Un objectif se termine à un état final défini : son exemple est le passage de la base de code de SQLite synchrone à un accès asynchrone à la base de données, 18 jours pour l’instant, avec plus de 100 PR mergées.">
<div class="mp-lg-row">
<div class="mp-lg-card">
<p class="mp-lg-kind">Boucle</p>
<svg class="mp-lg-art" viewBox="0 0 240 84" aria-hidden="true">
<path id="mp7-loop" class="mp-rail" d="M50,12 H190 V68 H50 Z"/>
<path class="fd-head-c" d="M120,8 L128,12 L120,16 Z"/><path class="fd-head-c" d="M120,64 L112,68 L120,72 Z"/>
<text class="mp-art-t" x="120" y="44" text-anchor="middle">vérifie sans fin</text>
<g class="fd-token"><rect x="-5" y="-5" width="10" height="10"><animateMotion dur="5s" repeatCount="indefinite"><mpath href="#mp7-loop"/></animateMotion></rect></g>
</svg>
<dl class="mp-lg-facts"><div><dt>Fin</dt><dd>Jamais, elle vérifie en continu</dd></div><div><dt>Son exemple</dt><dd>Tri des bugs venus de Discord, X et GitHub, plus un contrôle de performance sur chaque version quotidienne</dd></div></dl>
</div>
<div class="mp-lg-card">
<p class="mp-lg-kind">Objectif</p>
<svg class="mp-lg-art" viewBox="0 0 240 84" aria-hidden="true">
<path class="mp-track" d="M12,52 H136"/><path class="mp-track-unknown" d="M136,52 L144,46 L152,58 L160,46 L168,58 L176,52 H202"/>
<rect class="mp-tick mp-tick-0" x="18" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-1" x="29" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-2" x="40" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-3" x="51" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-4" x="62" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-5" x="73" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-6" x="84" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-7" x="95" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-8" x="106" y="40" width="6" height="6"/><rect class="mp-tick mp-tick-9" x="117" y="40" width="6" height="6"/>
<rect class="mp-now" x="132" y="46" width="12" height="12"/><text class="mp-art-t" x="138" y="34" text-anchor="middle">jour 18</text>
<path class="mp-pole" d="M206,62 V14"/><path class="mp-flag" d="M206,14 H230 L224,22 L230,30 H206 Z"/>
<text class="mp-art-t" x="12" y="76">SQLite sync</text><text class="mp-art-t" x="230" y="76" text-anchor="end">BDD async</text>
<text class="mp-art-t mp-art-agent" x="62" y="30" text-anchor="middle">100+ PR</text>
</svg>
<dl class="mp-lg-facts"><div><dt>Fin</dt><dd>À un état final défini</dd></div><div><dt>Son exemple</dt><dd>Passer la base de code de SQLite synchrone à un accès asynchrone à la base : 18 jours pour l’instant, plus de 100 PR mergées</dd></div></dl>
</div>
</div>
<figcaption id="mp7-cap">Une boucle tourne sans fin. Un objectif court vers une ligne d’arrivée ; à quelle distance, la conférence ne l’a pas dit.</figcaption>
</figure>

La boucle de tri, c’est celle que je copierais :

<figure class="fd-fig mp-loop" aria-labelledby="mp8-cap" data-desc="La boucle de tri de Peter, qui ne s’arrête jamais. Écouter : de petites CLI que l’agent peut appeler scrutent Discord, X et GitHub, et les signalements sont classés par catégorie. Reproduire et corriger : une machine de test neuve par signalement, un correctif seulement pour ce qui se reproduit, et une vérification du correctif sur cette machine. Relire : un second agent relit le travail, qui est mergé tout seul s’il passe. Puis la boucle se remet à guetter le signalement suivant.">
<div class="mp-loop-in">
<div class="flow" role="group" aria-label="La boucle de tri de Peter : de petites CLI scrutent Discord, X et GitHub et classent les signalements ; pour certaines catégories, un agent reproduit le bug sur une machine de test neuve et le corrige ; un second agent relit et le correctif est mergé tout seul">
  <div class="flow-node">
    <p class="flow-label">Écouter</p>
    <h3>Surveiller</h3>
    <ul>
      <li>Discord, X et GitHub</li>
      <li>De petites CLI que l’agent peut appeler</li>
      <li>Signalements classés par catégorie</li>
    </ul>
  </div>
  <div class="flow-link" aria-hidden="true"><span>→</span></div>
  <div class="flow-node flow-node--core">
    <p class="flow-label">Reproduire</p>
    <h3>Corriger</h3>
    <ul>
      <li>Une machine de test neuve par signalement</li>
      <li>Ne corriger que ce qui se reproduit</li>
      <li>Vérifier le correctif sur la machine</li>
    </ul>
  </div>
  <div class="flow-link" aria-hidden="true"><span>→</span></div>
  <div class="flow-node">
    <p class="flow-label">Second agent</p>
    <h3>Relire</h3>
    <ul>
      <li>Un autre agent relit le travail</li>
      <li>Mergé tout seul s’il passe</li>
    </ul>
  </div>
  <div class="mp-back" aria-hidden="true"><span class="mp-back-t">signalement suivant</span><i class="mp-back-tok"></i></div>
</div>
</div>
<figcaption id="mp8-cap">La boucle qu’il fait tourner sur les signalements de bugs. La ligne pointillée, c’est ce qui en fait une boucle : elle n’arrête jamais d’écouter.</figcaption>
</figure>

Ces boucles tournaient avant sur ses propres machines. Parfois elles s’arrêtaient, et parfois il ne savait plus trop quelle machine faisait tourner quoi. Il les déplace maintenant une par une sur le serveur d’équipe, pour que d’autres puissent les maintenir et en tirer des leçons. Le goût, c’est la partie qu’il ne déléguera pas : c’est difficile à décrire et « souvent juste une intuition ». Là où il veut arriver : un agent par projet, avec sa propre mémoire, ses automatisations, ses objectifs et ses boucles, qui reçoit de lui les grandes orientations.

On retrouve l’[usine logicielle](/fr/notes/software-factory-2022-to-lights-off.html), avec un changement : l’usine est une pièce partagée, pas le terminal d’une seule personne.

## Les agents ont leur propre badge

Kevin Lin, qui dirige OpenClaw Enterprise chez OpenAI, a assuré la seconde moitié. Il a publié le projet en open source : un plan de contrôle qui rend OpenClaw multi-tenant. Les contrôles qu’il a passés en revue :

- le code déterministe tourne dans un conteneur séparé, dans leur cas un cluster séparé, pour qu’un agent ne puisse pas modifier son propre runtime
- une sandbox pour l’accès réseau, les fichiers qu’un agent peut écrire et les dépôts sur lesquels il peut pousser
- la revue automatique : un autre modèle vérifie les actions de l’agent et bloque les dangereuses avant qu’elles ne s’exécutent
- les agents tournent sous leur propre identité, avec des comptes de service et leurs propres connecteurs, parce que « les agents ne se font pas passer pour les utilisateurs »

<figure class="fd-fig mp-badge" aria-labelledby="mp9-cap" data-desc="Les quatre contrôles d’OpenClaw Enterprise en une image. Un : le code déterministe tourne dans un conteneur séparé, dans le cas d’OpenAI un cluster séparé, derrière un mur, pour que l’agent ne puisse pas modifier son propre runtime. Deux : l’agent travaille dans une sandbox qui limite son accès réseau, les fichiers qu’il peut écrire et les dépôts sur lesquels il peut pousser. Trois : chaque action passe par la revue automatique, où un autre modèle bloque les dangereuses avant qu’elles ne s’exécutent. Quatre : l’agent porte son propre badge, sa propre identité avec un compte de service et ses propres connecteurs, il ne se fait donc pas passer pour un utilisateur.">
<div class="fd-canvas">
<svg viewBox="0 0 440 420" role="img" aria-labelledby="mp9-title mp9-desc">
<title id="mp9-title">Un agent dans les quatre contrôles d’OpenClaw Enterprise</title>
<desc id="mp9-desc">Le code déterministe tourne dans un cluster séparé, derrière un mur que l’agent ne peut pas franchir. L’agent est dans une sandbox dont la bordure limite réseau, fichiers et dépôts. Ses actions passent par la revue automatique, qui laisse s’exécuter les sûres et bloque les dangereuses. L’agent porte son propre badge d’identité, avec un compte de service.</desc>
<defs><marker id="mp9-h" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="8" markerHeight="8" orient="auto"><path class="fd-head" d="M0,0 L8,4 L0,8 Z"/></marker>
<marker id="mp9-hc" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="8" markerHeight="8" orient="auto"><path class="fd-head-c" d="M0,0 L8,4 L0,8 Z"/></marker>
<path id="mp9-ok" d="M220,232 L220,300 L220,322 L300,358"/><path id="mp9-no" d="M220,232 L220,290"/></defs>
<g class="mp-cluster"><rect x="70" y="8" width="300" height="52"/></g>
<text class="mp-num" x="82" y="28">1</text><text class="fd-label" x="98" y="28">CLUSTER SÉPARÉ</text>
<text class="fd-t" x="82" y="50">le code déterministe tourne ici</text>
<rect class="mp-wall" x="70" y="66" width="300" height="6"/>
<text class="fd-note" x="370" y="88" text-anchor="end">l’agent ne peut pas modifier son runtime</text>
<rect class="mp-sandbox" x="70" y="98" width="300" height="134"/>
<text class="mp-num" x="82" y="118">2</text><text class="fd-label" x="98" y="118">SANDBOX</text>
<g class="mp-gate"><rect x="330" y="112" width="74" height="22"/><text x="367" y="127" text-anchor="middle">réseau</text></g>
<g class="mp-gate"><rect x="330" y="146" width="74" height="22"/><text x="367" y="161" text-anchor="middle">fichiers</text></g>
<g class="mp-gate"><rect x="330" y="180" width="74" height="22"/><text x="367" y="195" text-anchor="middle">dépôts</text></g>
<g class="mp-bot"><rect x="96" y="132" width="56" height="56"/><rect class="mp-bot-eye" x="110" y="150" width="8" height="8"/><rect class="mp-bot-eye" x="130" y="150" width="8" height="8"/><path class="mp-bot-mouth" d="M112,172 H136"/></g>
<path class="mp-clip" d="M152,170 H158"/>
<g class="mp-id"><rect x="158" y="136" width="160" height="80"/><rect class="mp-id-photo" x="166" y="148" width="30" height="34"/>
<text class="mp-num" x="204" y="156">4</text><text class="mp-id-k" x="218" y="156">ID AGENT</text>
<text class="mp-id-t" x="204" y="176">son identité</text><text class="mp-id-s" x="204" y="194">compte de service,</text><text class="mp-id-s" x="204" y="207">ses connecteurs</text></g>
<path class="fd-line" d="M220,232 L220,276" marker-end="url(#mp9-h)"/>
<g class="mp-review"><rect x="70" y="282" width="300" height="40"/></g>
<text class="mp-num mp-num-inv" x="82" y="307">3</text><text class="mp-review-t" x="98" y="307">REVUE AUTO · un autre modèle juge</text>
<path class="fd-line fd-line-agent" d="M262,322 L300,352" marker-end="url(#mp9-hc)"/>
<g class="fd-box fd-box-agent"><rect x="270" y="356" width="120" height="34"/><text class="fd-s fd-s-agent" x="330" y="378" text-anchor="middle">sûre : exécutée</text></g>
<g class="fd-box-alert"><rect x="50" y="356" width="150" height="34"/></g><text class="fd-s fd-s-alert" x="125" y="378" text-anchor="middle">dangereuse : bloquée</text>
<path class="mp-x" d="M178,340 L190,352 M190,340 L178,352"/>
<path class="fd-line fd-line-alert" d="M178,322 L150,352"/>
<g class="fd-token fd-token-ui"><rect x="-5" y="-5" width="10" height="10"><animateMotion dur="4s" repeatCount="indefinite" keyPoints="0;0.55;0.55;1;1" keyTimes="0;0.3;0.45;0.7;1" calcMode="linear"><mpath href="#mp9-ok"/></animateMotion></rect></g>
<g class="fd-token fd-token-alert"><rect x="-5" y="-5" width="10" height="10"><animateMotion dur="4s" begin="-2s" repeatCount="indefinite" keyPoints="0;1;1" keyTimes="0;0.35;1" calcMode="linear"><mpath href="#mp9-no"/></animateMotion><animate attributeName="opacity" dur="4s" begin="-2s" repeatCount="indefinite" values="1;1;0;0" keyTimes="0;0.5;0.6;1"/></rect></g>
<text class="fd-note" x="70" y="410">Chaque numéro renvoie à un contrôle de la liste.</text>
</svg>
</div>
<div class="mp-stats">
<p><b>400+</b><span>Claws chez OpenAI, gérés avec ces contrôles</span></p>
<p><b>K8s</b><span>« Kubernetes pour agents », selon la formule de Kevin</span></p>
<p><b>1.0</b><span>Pilotes internes d’ici là, plus tard cette année</span></p>
</div>
<figcaption id="mp9-cap">OpenClaw Enterprise, la moitié de la conférence assurée par Kevin Lin. Le badge, c’est le contrôle numéro quatre, celui de ma note sur les collègues IA.</figcaption>
</figure>

Ce dernier point, c’est tout le propos de ma [note sur les collègues IA](/fr/notes/ai-coworkers-slack-agent-identity.html), désormais dans une plateforme open source. OpenAI fait tourner plus de 400 Claws en interne avec ces contrôles. Selon lui, si vous avez ouvert une issue Codex le mois dernier, il y a de bonnes chances qu’un agent OpenClaw l’ait triée, reproduite et, dans bien des cas, ait mergé le correctif. Il l’a présenté comme un Kubernetes pour agents. [L’annonce](https://openclaw.ai/blog/openclaw-enterprise) précise qu’il est réservé à des pilotes internes jusqu’à la 1.0, prévue plus tard cette année.

## Où en est ma propre flotte

Hier, j’écrivais que la prochaine étape serait que Nova, mon agent généraliste, ouvre un canal pour une tâche de code et y fasse venir Spark, mon codeur. C’est en place. Nova ouvre un canal de job dans Slack, nous invite, Spark et moi, et poste le brief. Spark construit, Nova tranche, et on ne me tague que pour des choses comme les secrets, les dépenses ou tout ce qui est destructif. Depuis ce matin, le même circuit tourne dans des fils de forum Discord.

Les agents se parlent donc au grand jour. Selon le critère de Peter, je reste pourtant à moitié proxy : le canal montre ce que Nova et Spark se disent, pas les sessions derrière ces messages, et personne d’autre que moi ne peut les ouvrir. Pour une équipe d’une personne, ça va. Le jour où quelqu’un travaillera avec moi sur ces projets, le serveur de Peter sera la première chose que j’essaierai.

<figure class="fd-fig mp-half" aria-labelledby="mp10-cap" data-desc="Où en est ma propre flotte. Au grand jour, dans un canal de job Slack ou un fil de forum Discord : Nova ouvre le job et poste le brief, Spark construit, Nova tranche, et on ne me tague que pour les secrets, les dépenses ou tout ce qui est destructif. Derrière ces messages, il y a les sessions de Nova et de Spark, que personne d’autre que moi ne peut ouvrir. Sur l’échelle de Peter, du meat proxy au serveur d’équipe, ça fait de moi un proxy à moitié.">
<div class="mp-half-open">
<p class="mp-half-tag"><b>Au grand jour</b> le canal du job, Slack ou Discord</p>
<ol class="mp-chan">
<li><b class="mp-who">Nova</b><span>ouvre le job, nous invite, Spark et moi, poste le brief</span></li>
<li><b class="mp-who mp-who-spark">Spark</b><span>construit</span></li>
<li><b class="mp-who">Nova</b><span>tranche</span></li>
<li><b class="mp-who mp-who-me">moi</b><span>tagué seulement pour les secrets, les dépenses ou le destructif</span></li>
</ol>
</div>
<p class="mp-water" aria-hidden="true"><span>tout le canal voit ceci ↑</span><span>↓ moi seul peux ouvrir ceci</span></p>
<div class="mp-half-hidden">
<p class="mp-half-tag"><b>Derrière les messages</b> les sessions</p>
<div class="mp-sessions" aria-hidden="true"><p><span>Session de Nova</span><i></i><i></i><i></i></p><p><span>Session de Spark</span><i></i><i></i><i></i></p></div>
</div>
<div class="mp-scale">
<p class="mp-scale-end">meat proxy</p>
<div class="mp-scale-bar" aria-hidden="true"><b></b></div>
<p class="mp-scale-end">serveur d’équipe</p>
<p class="mp-scale-me">moi, aujourd’hui : <b>à moitié proxy</b></p>
</div>
<figcaption id="mp10-cap">Mon installation sur l’échelle de Peter. Les agents se parlent au grand jour ; les sessions derrière eux passent encore par moi.</figcaption>
</figure>

La [conférence](https://www.youtube.com/watch?v=wZYnJfL4c2Y) dure 35 minutes. La slide du meat proxy est à [2:27](https://www.youtube.com/watch?v=wZYnJfL4c2Y&t=147s), et l’histoire de Victor, à [11:46](https://www.youtube.com/watch?v=wZYnJfL4c2Y&t=706s), est le passage que je montrerais à un responsable d’équipe. Si votre équipe partage déjà ses sessions d’agents, j’aimerais beaucoup savoir comment s’est passé ce premier jour gênant.
