---
title: Don't be your team's meat proxy
description: At OpenAI DevDay, OpenClaw's Peter Steinberger turned "meat proxy" from an insult into a team problem. When the agents run on your machines, teammates can only reach them through you. His fix is a shared server where anyone can read and prompt anyone's agent session.
date: 2026-10-08
tags: AI agents, OpenClaw, Codex, multiplayer, code review
---

When your agents run on your machines, your team can only reach them through you. Peter Steinberger, who created OpenClaw and now works on agents at OpenAI, calls that being a meat proxy. At OpenAI DevDay he showed his fix: move the agent sessions onto a shared team server, where anyone can read, prompt or pick up anyone's session.

The last two talks I wrote up were about the agents themselves: Dex Horthy's [software factory](/notes/software-factory-2022-to-lights-off.html) and MintMCP's [AI coworkers in Slack](/notes/ai-coworkers-slack-agent-identity.html). Peter's is about the people around them. Everyone on his team had agents. They still weren't working together.

## More machines didn't fix it

He opened with how his own setup grew this year. First the terminal: split screens, lots of Codex sessions, a finger on the escape key to steer. The models got better and he steered less, so he moved to the Codex desktop app, where running many sessions at once is easier. Then his laptop ran out of disk and his fans "sounded like a jet engine", so he spread the work over six to ten machines: devboxes, plus cloud boxes that run the tests.

<figure class="fd-fig mp-grow" aria-labelledby="mp2-cap" data-desc="Peter's setup over the year, in three steps. First the terminal: split screens, lots of Codex sessions, a finger on Escape to steer. Then the Codex desktop app, where running many sessions at once is easier. Then six to ten machines: devboxes, plus cloud boxes that run the tests. Each step adds compute, and in all three his teammates still reach the agents through him.">
<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">Split screens, lots of Codex sessions, a finger on Esc to steer</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>Codex app</p>
<p class="mp-trio-what">Many sessions at once, easier to run</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 to 10 machines</p>
<p class="mp-trio-what">Devboxes, plus cloud boxes that run the tests</p>
</li>
</ol>
<p class="mp-strip"><b>Every time</b><span>More compute below. The same one person between his teammates and the agents.</span></p>
<figcaption id="mp2-cap">His year, as he tells it at the start of the talk. Top of each setup: his teammates, then him. Bottom: the machines.</figcaption>
</figure>

None of that fixed the real bottleneck:

> When my teammates wanted to get involved, they still had to come through me. You know, we were all working with agents, but we weren't really working together.


<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">Through you</label><label for="mp1-server">Team server</label></div>
<div class="fd-canvas">
<svg viewBox="0 0 440 382" role="img" aria-labelledby="mp1-title mp1-desc">
<title id="mp1-title">Where the agent sessions live</title>
<desc id="mp1-desc">Through you: six teammates all reach the agent sessions through one person, who runs them on their own machines and relays every ask and every answer. Team server: the sessions live on a shared server, and every teammate, you included, reads and prompts any session directly.</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">YOUR 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">every ask</text><text class="fd-note" x="8" y="137">goes through you</text>
<text class="fd-note" x="432" y="122" text-anchor="end">every answer</text><text class="fd-note" x="432" y="137" text-anchor="end">comes back too</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">You</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">TEAM SERVER</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">you</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">Through you: the agents run on your machines, so every teammate's ask goes through you and every answer comes back the same way. That's the meat proxy.</span>
<span class="fd-stage mp-in-server">Team server: the sessions live in a shared place. Anyone on the team reads any session, prompts it or picks it up where someone stopped, and you're one more seat in the row.</span>
<span class="fd-credit">The first tab is redrawn from Peter Steinberger's slide in <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; the second is the team server he described. Switch the tabs.</span>
</figcaption>
</figure>

## Meat proxy, take two

The term is Niklas Gruhn's. His August post, [Don't be a meat proxy](https://gruhn.me/blog/2026-08-03/), is about someone who pastes AI output to coworkers without reading it, so the coworker might as well have asked the AI. It's an insult for a habit.

Peter uses it for something bigger: being the interface to the AI, passing messages back and forth. You can read every word your agent writes and still be one, if the agents only exist on your laptop. That's what's new for me in this talk. It's not about discipline. It's about where the sessions live.

<figure class="fd-fig mp-two" aria-labelledby="mp3-cap" data-desc="Two meanings of meat proxy. Niklas Gruhn's is a habit: AI output passes through someone who doesn't read it, so the coworker might as well have asked the AI. Peter's is about location: you can read every word, but if the agents only exist on your laptop, every ask and every answer still passes through you. It's not about discipline. It's about where the sessions live.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Niklas Gruhn · August</p>
<p class="mp-two-name">A habit</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">AI</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">AI output</text>
<text class="mp-cap-t" x="150" y="88" text-anchor="middle">doesn't read it</text>
<text class="mp-cap-t" x="262" y="88" text-anchor="middle">coworker</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">AI output passed on without reading it</p>
<p class="mp-two-line">The coworker might as well have asked the AI</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">A location</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">teammate</text>
<text class="mp-cap-t" x="150" y="88" text-anchor="middle">reads every word</text>
<text class="mp-cap-t" x="259" y="88" text-anchor="middle">your laptop</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">You read every word and you're still one</p>
<p class="mp-two-line">The agents only exist on your laptop</p>
</div>
</div>
<p class="mp-strip"><b>What's new</b><span>It's not about discipline. It's about where the sessions live.</span></p>
<figcaption id="mp3-cap">Same two words, two problems. In both, the work passes through one person; in Peter's, reading it doesn't change that.</figcaption>
</figure>

## Show me the prompt

His first try wasn't a server. One sentence can now produce tens of thousands of lines of code, but the conversation behind it stays on someone's machine. He reviewed plenty of PRs where he understood what changed, but not why.

So he added a skill that asked contributors to attach a sanitized transcript to their PR. Very few said yes, and he admits he sometimes said no too. Sharing how you talk to your agent feels surprisingly personal.

When his team made every session visible, it felt awkward for a day. They read each other's conversations, laughed a little, and then it was normal. Now they learn from each other's prompting and catch mistakes earlier.

<figure class="fd-fig mp-why-fig" aria-labelledby="mp4-cap" data-desc="How much of the why reaches a reviewer, in three steps. The diff alone shows what changed, not why: the conversation stays on someone's laptop. An opt-in sanitized transcript on the PR: very few said yes, and Peter sometimes said no too. Every session visible to the team: awkward for a day, then normal, and now they learn from each other's prompting and catch mistakes earlier.">
<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">+ the why</p>
<div class="mp-why mp-why-none" aria-hidden="true"><span>stays on a laptop</span></div>
<p class="mp-trio-n"><b>1</b>The diff alone</p>
<p class="mp-trio-what">What changed, not why</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">+ the why</p>
<div class="mp-why mp-why-rare" aria-hidden="true"><i></i><i class="x"></i><i></i><i class="x"></i><b>rarely</b></div>
<p class="mp-trio-n"><b>2</b>Opt-in transcript</p>
<p class="mp-trio-what">A sanitized transcript on the PR. Very few said yes; he sometimes said no too</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">+ the why</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>Every session visible</p>
<p class="mp-trio-what">Awkward for a day, then normal. Now they learn from each other's prompting</p>
</li>
</ol>
<figcaption id="mp4-cap">Show me the prompt: the same PR, with less or more of the conversation behind it.</figcaption>
</figure>

The demo made the case better than the slides. He wakes up to a PR where Victor, a teammate, made the tables smaller, the day after Peter made them bigger. The old reflex would have been what he called a "not very Californian message". Instead he opens the work session behind the PR. Victor had reused Peter's own session, pinged him first, and fixed what Peter got wrong. Crisis over before lunch.

<figure class="fd-fig mp-story" aria-labelledby="mp5-cap" data-desc="The Victor story in six panels. The day before, Peter makes the tables bigger. Next morning he wakes up to a PR where Victor made them smaller. The old reflex would have been a not very Californian message. Instead he opens the work session behind the PR. Victor had reused Peter's own session and pinged him first. He had fixed what Peter got wrong: crisis over before lunch.">
<ol class="mp-story-strip" tabindex="0" aria-label="The Victor story, six panels">
<li class="mp-panel">
<p class="mp-panel-when"><b>1</b>The day before</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">tables: bigger</text></svg>
<p class="mp-panel-say">Peter makes the tables bigger.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>2</b>Next morning</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">He wakes up to a PR. Victor made the tables smaller.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>3</b>The old reflex</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">never sent</text></svg>
<p class="mp-panel-say">The old reflex: a “not very Californian message”.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>4</b>Instead</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">work 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">Instead, he opens the work session behind the PR.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>5</b>In the 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">Peter's session</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">reused this 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">pinged Peter</text></svg>
<p class="mp-panel-say">Victor had reused Peter's own session, and pinged him first.</p>
</li>
<li class="mp-panel">
<p class="mp-panel-when"><b>6</b>Before lunch</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">“I was wrong.”</text></svg>
<p class="mp-panel-say">He'd fixed what Peter got wrong. Crisis over before lunch.</p>
</li>
</ol>
<figcaption id="mp5-cap">The demo at 11:46, as six panels. “I was wrong” is Peter, on stage.<span class="mp-swipe" aria-hidden="true">Swipe for the next panel →</span></figcaption>
</figure>

His conclusion is blunt: pull requests as the way to collaborate "just feels not the future anymore". On the team server, anyone sees and prompts anyone's session, so the one rule is to invite only people you're fine with messing with your sessions. Next, he wants to invite OpenClaw's top contributors: they get the tokens, and the project gets a bit of their ideas. "I think it's an amazing deal."

## The server is a place, not an app

The sidebar of that server is full of small apps: CI times, community numbers (PRs opened, issues, merges), a "daily Claw" newspaper written from whatever merged, a slop meter that keeps pushing the agents to clean up, activity reports, and meetings. They used to pay for meeting software until he decided "this is a prompt". Now the agent joins their Discord calls, writes the summary, and can answer back by voice.

He describes a dashboard as a session that generates an artifact, plus an automation that keeps it updated. Want it blue? Tell the agent. It changes so fast he'd rather call it jellyware than software. And because each dashboard is a session on the shared server, anyone on the team can change it, not only whoever built it.

<figure class="fd-fig mp-tour" aria-labelledby="mp6-cap" data-desc="A schematic of the team server's sidebar, with six small apps: CI times, community numbers (PRs opened, issues, merges), the Daily Claw newspaper written from whatever merged, a slop meter that keeps pushing the agents to clean up, activity reports, and meetings, where the agent joins the Discord call, writes the summary and can answer back by voice. A dashboard is a session that generates an artifact, plus an automation that keeps it updated; to change one, you tell the agent, for example to make it blue.">
<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>team server</span></div>
<div class="mp-win-body">
<div class="mp-side"><p class="mp-side-h">Apps</p><label for="mp6-ci">CI times</label><label for="mp6-com">Community</label><label for="mp6-claw">Daily Claw</label><label for="mp6-slop">Slop meter</label><label for="mp6-rep">Reports</label><label for="mp6-meet">Meetings</label></div>
<div class="mp-pane">
<div class="mp-app mp-app-ci">
<p class="mp-app-h">CI times</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">Tell the agent</span><span class="mp-ask-off">“make this blue”</span><span class="mp-ask-on">“make it ink again”</span><b aria-hidden="true">↵</b></label>
</div>
<div class="mp-app mp-app-com">
<p class="mp-app-h">Community</p>
<div class="mp-counts" aria-hidden="true"><p><span>PRs opened</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>Merged</span><i></i><i></i><i></i><i></i><i></i><i></i></p></div>
<p class="mp-app-note">The project's numbers: PRs opened, issues, merges.</p>
</div>
<div class="mp-app mp-app-claw">
<p class="mp-mast">The Daily Claw</p>
<p class="mp-mast-sub">Written from whatever merged</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">Slop meter</p>
<div class="mp-meter" aria-hidden="true"><span>clean</span><i><b></b></i><span>slop</span></div>
<p class="mp-app-note">Keeps pushing the agents to clean up.</p>
</div>
<div class="mp-app mp-app-rep">
<p class="mp-app-h">Reports</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">Activity: who commits, who's on Discord.</p>
</div>
<div class="mp-app mp-app-meet">
<p class="mp-app-h">Meetings <span class="mp-live">in a call</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">The agent joins the Discord call, writes the summary, and can answer back by voice.</p>
</div>
</div>
</div>
</div>
<div class="mp-eq-row">
<p class="mp-eq-box">Session</p><p class="mp-eq-op">makes</p><p class="mp-eq-box mp-eq-art">Artifact</p><p class="mp-eq-op">kept fresh by</p><p class="mp-eq-box">Automation</p>
<p class="mp-eq-is"><span>= a dashboard.</span> He'd call it jellyware.</p>
</div>
<figcaption id="mp6-cap">A schematic of the sidebar he toured, not a screenshot. Pick an app. On CI times, tell the agent to make it blue.</figcaption>
</figure>

He also thinks CI as we run it no longer makes sense, and is trying Codex to pick which tests a change actually needs. He saved that one for another talk.

## Loops, goals and taste

Then the factory part. He runs two kinds of long-lived work:

<figure class="fd-fig mp-lg" aria-labelledby="mp7-cap" data-desc="Two kinds of long-lived work. A loop never ends, it keeps checking: his examples are bug triage from Discord, X and GitHub, plus a performance check on every daily release. A goal ends at a defined end state: his example is moving the codebase from synchronous SQLite to async database access, 18 days so far, with over 100 PRs landed.">
<div class="mp-lg-row">
<div class="mp-lg-card">
<p class="mp-lg-kind">Loop</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">keeps checking</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>Ends</dt><dd>Never, it keeps checking</dd></div><div><dt>His example</dt><dd>Bug triage from Discord, X and GitHub, plus a performance check on every daily release</dd></div></dl>
</div>
<div class="mp-lg-card">
<p class="mp-lg-kind">Goal</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">day 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">sync SQLite</text><text class="mp-art-t" x="230" y="76" text-anchor="end">async DB</text>
<text class="mp-art-t mp-art-agent" x="62" y="30" text-anchor="middle">100+ PRs</text>
</svg>
<dl class="mp-lg-facts"><div><dt>Ends</dt><dd>At a defined end state</dd></div><div><dt>His example</dt><dd>Move the codebase from synchronous SQLite to async database access: 18 days so far, over 100 PRs landed</dd></div></dl>
</div>
</div>
<figcaption id="mp7-cap">A loop goes round for good. A goal runs toward a finish line; how far off it is, the talk didn't say.</figcaption>
</figure>

The triage loop is the one I'd copy:

<figure class="fd-fig mp-loop" aria-labelledby="mp8-cap" data-desc="Peter's triage loop, which never ends. Listen: small CLIs the agent can call scan Discord, X and GitHub, and the reports are sorted by category. Reproduce and fix: a fresh test box per report, a fix only for what it reproduces, and a check of the fix on that box. Review: a second agent reviews the work, and it lands on its own if it passes. Then the loop goes back to listening for the next report.">
<div class="mp-loop-in">
<div class="flow" role="group" aria-label="Peter's triage loop: small CLIs scan Discord, X and GitHub and sort the reports; for some categories an agent reproduces the bug on a fresh test box and fixes it; a second agent reviews and the fix lands on its own">
  <div class="flow-node">
    <p class="flow-label">Listen</p>
    <h3>Monitor</h3>
    <ul>
      <li>Discord, X and GitHub</li>
      <li>Small CLIs the agent can call</li>
      <li>Reports sorted by category</li>
    </ul>
  </div>
  <div class="flow-link" aria-hidden="true"><span>→</span></div>
  <div class="flow-node flow-node--core">
    <p class="flow-label">Reproduce</p>
    <h3>Fix</h3>
    <ul>
      <li>A fresh test box per report</li>
      <li>Fix only what it reproduces</li>
      <li>Check the fix on the box</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>Review</h3>
    <ul>
      <li>Another agent reviews the work</li>
      <li>It lands on its own if it passes</li>
    </ul>
  </div>
  <div class="mp-back" aria-hidden="true"><span class="mp-back-t">next report</span><i class="mp-back-tok"></i></div>
</div>
</div>
<figcaption id="mp8-cap">The loop he runs on bug reports. The dashed line is the part that makes it a loop: it never stops listening.</figcaption>
</figure>

Those loops used to run on his own machines. Sometimes they stopped, and sometimes he wasn't sure which machine was running which. Now he's moving them to the team server one by one, so others can maintain them and learn from them. Taste is the part he won't hand over: it's hard to describe and "often just a feeling". Where he wants to end up is an agent per project, with its own memory, automations, goals and loops, taking high-level direction from him.

That's the [software factory](/notes/software-factory-2022-to-lights-off.html) again, with one change: the factory is a shared room, not one person's terminal.

## Agents get their own badge

Kevin Lin, who leads OpenClaw Enterprise at OpenAI, took the second half and open-sourced it: a control plane that makes OpenClaw multi-tenant. The controls he walked through:

- the deterministic code runs in a separate container, in their case a separate cluster, so an agent can't change its own runtime
- sandboxing for network access, the files an agent can write and the repos it can push to
- auto-review: another model checks the agent's actions and blocks the dangerous ones before they run
- agents run as their own identities, with service accounts and their own connectors, because "agents aren't impersonating users"

<figure class="fd-fig mp-badge" aria-labelledby="mp9-cap" data-desc="OpenClaw Enterprise's four controls in one picture. One: the deterministic code runs in a separate container, in OpenAI's case a separate cluster, behind a wall, so the agent can't change its own runtime. Two: the agent works inside a sandbox that limits its network access, the files it can write and the repos it can push to. Three: every action passes auto-review, where another model blocks the dangerous ones before they run. Four: the agent wears its own badge, its own identity with a service account and its own connectors, so it isn't impersonating a user.">
<div class="fd-canvas">
<svg viewBox="0 0 440 420" role="img" aria-labelledby="mp9-title mp9-desc">
<title id="mp9-title">An agent inside OpenClaw Enterprise's four controls</title>
<desc id="mp9-desc">The deterministic code runs in a separate cluster, behind a wall the agent can't cross. The agent sits in a sandbox whose border limits network, files and repos. Its actions go through auto-review, which lets safe ones run and blocks dangerous ones. The agent wears its own identity badge with a service account.</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">SEPARATE CLUSTER</text>
<text class="fd-t" x="82" y="50">the deterministic code runs here</text>
<rect class="mp-wall" x="70" y="66" width="300" height="6"/>
<text class="fd-note" x="370" y="88" text-anchor="end">so the agent can't change its 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">network</text></g>
<g class="mp-gate"><rect x="330" y="146" width="74" height="22"/><text x="367" y="161" text-anchor="middle">files</text></g>
<g class="mp-gate"><rect x="330" y="180" width="74" height="22"/><text x="367" y="195" text-anchor="middle">repos</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">AGENT ID</text>
<text class="mp-id-t" x="204" y="176">own identity</text><text class="mp-id-s" x="204" y="194">service account,</text><text class="mp-id-s" x="204" y="207">own connectors</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">AUTO-REVIEW · another model checks</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">safe: it runs</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">dangerous: blocked</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">Numbers follow the four controls in the list above.</text>
</svg>
</div>
<div class="mp-stats">
<p><b>400+</b><span>Claws inside OpenAI, run with these controls</span></p>
<p><b>K8s</b><span>“Kubernetes for agents”, as Kevin pitched it</span></p>
<p><b>1.0</b><span>Internal pilots until then, later this year</span></p>
</div>
<figcaption id="mp9-cap">OpenClaw Enterprise, Kevin Lin's half of the talk. The badge is control four, the one my AI coworkers note was about.</figcaption>
</figure>

That last one is the point of my [AI coworkers note](/notes/ai-coworkers-slack-agent-identity.html), now in an open-source platform. OpenAI runs over 400 Claws internally with these controls. He said that if you filed a Codex issue in the last month, there's a good chance an OpenClaw agent triaged it, reproduced it and, in many cases, merged the fix. He pitched it as Kubernetes for agents. [The announcement](https://openclaw.ai/blog/openclaw-enterprise) says it's for internal pilots until 1.0, later this year.

## Where my own fleet sits

Yesterday I wrote that next I wanted Nova, my generalist agent, to open a channel for a coding job and bring in Spark, my coder. That works now. Nova opens a job channel in Slack, invites Spark and me, and posts the brief. Spark builds, Nova makes the calls, and I only get tagged for things like secrets, spending or anything destructive. Since this morning the same flow runs in Discord forum threads.

So the agents talk in the open. By Peter's standard I'm still half a proxy, though: the channel shows what Nova and Spark tell each other, not the sessions behind those messages, and nobody but me can open those. For a team of one that's fine. The day someone works on these projects with me, his server is the first thing I'll try.

<figure class="fd-fig mp-half" aria-labelledby="mp10-cap" data-desc="Where my own fleet sits. In the open, in a Slack job channel or a Discord forum thread: Nova opens the job and posts the brief, Spark builds, Nova makes the calls, and I get tagged only for secrets, spending or anything destructive. Behind those messages are Nova's and Spark's sessions, which nobody but me can open. On Peter's scale, from meat proxy to team server, that makes me half a proxy.">
<div class="mp-half-open">
<p class="mp-half-tag"><b>In the open</b> the job channel, Slack or Discord</p>
<ol class="mp-chan">
<li><b class="mp-who">Nova</b><span>opens the job, invites Spark and me, posts the brief</span></li>
<li><b class="mp-who mp-who-spark">Spark</b><span>builds</span></li>
<li><b class="mp-who">Nova</b><span>makes the calls</span></li>
<li><b class="mp-who mp-who-me">me</b><span>tagged only for secrets, spending or anything destructive</span></li>
</ol>
</div>
<p class="mp-water" aria-hidden="true"><span>anyone in the channel sees this ↑</span><span>↓ only I can open this</span></p>
<div class="mp-half-hidden">
<p class="mp-half-tag"><b>Behind the messages</b> the sessions</p>
<div class="mp-sessions" aria-hidden="true"><p><span>Nova's session</span><i></i><i></i><i></i></p><p><span>Spark's session</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">team server</p>
<p class="mp-scale-me">me, today: <b>half a proxy</b></p>
</div>
<figcaption id="mp10-cap">My setup on Peter's scale. The agents talk in the open; the sessions behind them still go through me.</figcaption>
</figure>

The [talk](https://www.youtube.com/watch?v=wZYnJfL4c2Y) is 35 minutes. The meat proxy slide is at [2:27](https://www.youtube.com/watch?v=wZYnJfL4c2Y&t=147s), and the Victor story at [11:46](https://www.youtube.com/watch?v=wZYnJfL4c2Y&t=706s) is the part I'd show a team lead. If your team already shares agent sessions, I'd love to hear how the awkward first day went.
