---
title: "Agents don't fit Kubernetes, and three more problems still open"
description: Katelyn Lesse, head of platform at Anthropic, lists the engineering problems multiagent systems create. Infrastructure built for stateless pods, identity and consent for agents acting on a human's behalf, isolation when thousands of agents run untrusted code, and a kill switch that can stop a whole system at once. Notes on her article and her sandboxing post, and where my own fleet stands on each.
date: 2026-10-26
tags: AI agents, multiagent systems, agent identity, agent security, infrastructure
---

Kubernetes was built for stateless, replicated apps. An agent is the opposite: one isolated, stateful instance that sits idle for hours, then wakes up and waits on a tool, a model or a person. That mismatch is the first of four problems Katelyn Lesse, head of platform at Anthropic, says software engineers have to solve before multiagent systems can be trusted with serious work. The other three: who an agent is and what it may do, how far a compromised agent's damage spreads, and how to stop a whole system at once.

Her [article](https://x.com/i/article/2114537761030230016) went up on X on October 26. It's short, and it opens on the engineers she sees going through an identity crisis as the job changes. Her answer isn't comfort. It's a list of work. I run 17 agents on a Mac mini and I'm moving one of them into a sandbox on an old Dell, so at the end I hold my own fleet against her four.

## From a chat to thousands of agents

Her account of how we got here is quick. Agents started as chats with a human in the loop. Then models got better at running longer on harder problems, and agentic systems moved to the cloud. Then models got better at working together, and people built basic multiagent systems: an orchestrator that spawns subagents for a task, or agents given jobs other than executing, "like grading or advising or dreaming".

Now some teams are building systems for serious research, discovery and hardware design. Her picture is thousands of agents, persistently working towards an outcome. That's where the new problems show up, and she names four. Infrastructure for burstier workloads. Authentication and authorization, so agents can be identified, work together, take the actions they should and be kept from the ones they shouldn't. Security and isolation for untrusted code and content. And monitoring, with the ability to stop a system "when it's veering into the wrong territory".

Models will keep getting better, she says, and these systems will become really powerful. Whether the world trusts that power to cure diseases instead of causing harm is on the engineers who build the plumbing.

<figure class="fd-fig op op-f1" aria-labelledby="op1-cap" data-desc="How agents got here, in four stages, then the four problems she names. One: a chat, with a human in the loop and one question at a time. Two: longer runs on harder problems, so the agent moves to the cloud. Three: orchestrators that spawn subagents for a task, and agents given other jobs, grading, advising or dreaming. Four: thousands of persistent agents working on serious research, discovery and hardware design. Under the stages, the four problems: infrastructure, identity and access, security and isolation, monitoring and halting.">
<p class="ea-now ea-say4" aria-hidden="true"><span>A chat, a human in the loop</span><span>Longer runs, in the cloud</span><span>An orchestrator and its subagents</span><span>Thousands of agents, persistently</span></p>
<ol class="op-stages ea-cyc4" aria-label="How agents got here, in four stages">
<li><p class="op-art op-art-1" aria-hidden="true"><i class="op-you"></i><i class="op-ag"></i></p><p class="op-stage-n"><b>1</b>A chat</p><p class="op-stage-s">A human in the loop, one question at a time</p></li>
<li><p class="op-art op-art-2" aria-hidden="true"><i class="op-ag op-ag-long"></i><i class="op-cloud">cloud</i></p><p class="op-stage-n"><b>2</b>Long runs</p><p class="op-stage-s">Harder problems, longer runs, so the agent moves to the cloud</p></li>
<li><p class="op-art op-art-3" aria-hidden="true"><i class="op-ag"></i><span class="op-subs"><i class="op-ag op-ag-s"></i><i class="op-ag op-ag-s"></i><i class="op-ag op-ag-s"></i></span></p><p class="op-stage-n"><b>3</b>Orchestrators</p><p class="op-stage-s">Subagents spawned per task; others grade, advise or dream</p></li>
<li><p class="op-art op-art-4" aria-hidden="true"><span class="op-many"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span></p><p class="op-stage-n"><b>4</b>Thousands</p><p class="op-stage-s">Persistent agents on research, discovery and hardware design</p></li>
</ol>
<p class="op-probs"><span class="rp-k">The problems she names</span><b>Infrastructure</b><b>Identity and access</b><b>Security and isolation</b><b>Monitoring and halting</b></p>
<figcaption id="op1-cap">Her four stages, drawn as agents: the yellow square is the human, the blue ones are agents. The grid in the last stage stands for thousands.</figcaption>
</figure>

## Agents don't fit Kubernetes

The software industry has been building on Kubernetes, which was designed for stateless, replicated apps, or for stable, numbered sets of stateful pods. Agents are "isolated, stateful, single-instance workloads". They go idle for arbitrary stretches between bits of work. They spend most of their life waiting: on tools, on model inference, on other agents, on a human.

Each of those shapes wants something different from the machine underneath. Some workloads need fast startup. Some need to stop burning compute while they wait. Some need a crazy scale. She points at AI infra companies building new filesystems and sandboxing offerings, and at the Google team building Agent Substrate as a new runtime, and says there's a ton left to figure out.

My fleet is a small version of the idle problem. Seventeen OpenClaw agents live on one Mac mini, each behind its own Telegram bot, and most of them do nothing until a message arrives. Forge, my open-source contribution agent, is the other shape: a worker starts for one issue, clones a repository, runs its tests and is gone. Neither looks like a replica set.

<figure class="fd-fig op op-f2" aria-labelledby="op2-cap" data-desc="What Kubernetes was built for against what an agent is. On the left, replicas: six identical squares, stateless, replicated and interchangeable, or a stable numbered set of stateful pods, always on. On the right, one instance: a single agent, isolated, stateful and single-instance, idle for arbitrary stretches, waiting on tools, the model, other agents or a human. Under them, a schematic day of an agent: short bursts of work separated by long waits, labelled waiting on a human, on the model, on a tool. She names the people pushing on this: AI infra companies building new filesystems and sandboxing offerings, and Google's Agent Substrate runtime.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">What Kubernetes was built for</p>
<p class="mp-two-name">Replicas</p>
<p class="op-pods" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></p>
<p class="mp-two-line">Stateless, replicated, interchangeable</p>
<p class="mp-two-line">Or a stable, numbered set of stateful pods</p>
<p class="mp-two-line">Always on</p>
</div>
<p class="mp-two-vs">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">What an agent is</p>
<p class="mp-two-name">One instance</p>
<p class="op-pods op-pods-one" aria-hidden="true"><i class="op-pod-ag"></i></p>
<p class="mp-two-line">Isolated, stateful, single instance</p>
<p class="mp-two-line">Idle for arbitrary stretches</p>
<p class="mp-two-line">Waiting on tools, the model, other agents, a human</p>
</div>
</div>
<p class="op-day-k"><span class="rp-k">One agent's day</span><b class="op-k-work">work</b><b class="op-k-wait">waiting</b></p>
<div class="op-day" aria-hidden="true">
<i class="op-work op-w1"></i><i class="op-wait op-wt1"><span>on a human</span></i><i class="op-work op-w2"></i><i class="op-wait op-wt2"><span>on the model</span></i><i class="op-work op-w3"></i><i class="op-wait op-wt3"><span>on a tool</span></i><i class="op-work op-w4"></i><i class="op-wait op-wt4"><span>on a human</span></i>
<b class="op-cur"></b>
</div>
<p class="mp-strip"><b>She names</b><span>AI infra companies building new filesystems and sandboxing offerings, and the Google team building Agent Substrate as a new runtime.</span></p>
<figcaption id="op2-cap">The day is schematic: she gives no durations, only the shape. The square is where the agent is right now.</figcaption>
</figure>

## Who did that, you or your agent

Authentication, identifying the agent that took an action, is the easier half. The microservices world already built and hardened the pieces: workload identity, short-lived certificates instead of static keys. People are starting to apply them to agents.

Authorization is "much more wide open". Most agents today work on behalf of a human and use that human's identity and credentials to reach systems and take actions. The first problem hides inside that sentence: on the receiving system, nothing says whether the human or the agent did it. The deeper one is consent. If a multiagent system works for weeks, how does the human meaningfully approve what their agent can do? Auto-approval of tool calls helps, she says, but at scale the permissioning has to go deeper than that.

Then the part even less solved: agents with their own identity, and agents working together. How does an agent trust another agent that asked it for something?

I know the first problem from the receiving end. Every pull request my agents open is authored by me, as far as GitHub knows. In my own repositories, the one trace that a session did the work is a session id in an HTML comment in the PR body. And my first try at scoping what an agent may do taught me how thin that layer is: a deny rule in my gateway config matched nothing for a month, and an agent that was supposed to be locked out of my finance app was offered all 13 of its tools. I wrote that up in the [note on AI coworkers in Slack](/notes/ai-coworkers-slack-agent-identity.html), where MintMCP gives every agent an identity of its own.

<figure class="fd-fig op op-f3" aria-labelledby="op3-cap" data-desc="The on-behalf-of problem. A chain of three boxes: the human, me, then the agent acting on my behalf, then the system, GitHub, a database or an API. My token travels along both links, so the system's audit log records the author as me, and nothing says whether it was me or the agent. Under the chain, the four open questions she lists. One, who: the action lands under the human's identity. Two, consent: a system that works for weeks, and how the human meaningfully approves what it may do. Three, identity: agents with an identity of their own, even less solved. Four, trust: how an agent trusts another agent that asked it for something. Authentication, by contrast, can borrow workload identity and short-lived certificates from microservices.">
<p class="ea-now ea-say4" aria-hidden="true"><span>The agent uses my credentials</span><span>The log says: me</span><span>Weeks in, I'm still "approving"</span><span class="ea-no">An agent asks an agent: trust it?</span></p>
<div class="op-chain" aria-hidden="true">
<div class="ea-box op-box-you"><p class="ea-box-k">Human</p><p class="ea-box-n">me</p></div>
<span class="op-link op-l1"><i class="op-key">my token</i></span>
<div class="ea-box ea-box-sv"><p class="ea-box-k">Agent</p><p class="ea-box-n">on my behalf</p></div>
<span class="op-link op-l2"><i class="op-key">my token</i></span>
<div class="ea-box"><p class="ea-box-k">System</p><p class="ea-box-n">GitHub, a database, an API</p></div>
</div>
<p class="op-log"><b>Audit log</b><code>author: me</code><span>me, or the agent?</span></p>
<ol class="ea-rows op-cyc4" aria-label="Four open questions">
<li><b>1</b><span class="ea-who">Who</span><span>The action lands under the human's identity. Nothing says the agent did it.</span></li>
<li><b>2</b><span class="ea-who">Consent</span><span>A system that works for weeks: how does the human meaningfully approve what it may do?</span></li>
<li><b>3</b><span class="ea-who">Identity</span><span>Agents with an identity of their own. Even less solved.</span></li>
<li class="ea-row-no"><b>4</b><span class="ea-who">Trust</span><span>How does an agent trust another agent that asked it for something?</span></li>
</ol>
<p class="mp-strip"><b>The easier half</b><span>Authentication can borrow workload identity and short-lived certificates from microservices.</span></p>
<figcaption id="op3-cap">The chain is every agent I run today. The four rows are her list of what authorization still has to answer.</figcaption>
</figure>

## One compromised agent is a blast radius

Over the past few months, she writes, and especially the past couple of weeks, vulnerabilities have surfaced faster than the industry can patch them, much of it in core software that many systems rely on. Put thousands of persistent agents on top of that software, writing untrusted code and reading untrusted content, and every unpatched vulnerability gets more dangerous. Her ask to engineers is to get creative about hardening the kernels, browsers, runtimes and common libraries those agents run on.

Multiagent systems add a twist. A compromised agent can pass injected instructions to the agents it works with, and those instructions can end up in memory, where future agents trust them by accident. So the question becomes blast radius: when the first agent falls, how much of the system is at risk? Her answer is isolation. Agents should take their actions from strongly isolated, sandboxed execution environments.

She wrote the longer version in September, in [Secure agents: architecture and sandboxing](https://www.katelynlesse.com/blog/secure-agents-architecture-and-sandboxing), and it's the most practical page on the subject I've read. Split the brain from the hands. The harness, the session state and the credentials live outside the sandbox, on infrastructure you trust, and the sandbox is just a tool the agent uses to run code. When code in the sandbox needs an external service, the request leaves through an egress proxy that adds the credential on the way out, scoped to that one destination. The sandbox can hold a placeholder that the proxy swaps for the real key. Her line on the alternative, everything in one box: "Your kill switch is basically inside the thing you're trying to kill."

The sandbox itself then needs four settings. Isolation, from weakest to strongest: containers, which share the host kernel and shouldn't be a security boundary for untrusted code; a user-space kernel like gVisor; microVMs like Firecracker, each with its own kernel behind the CPU's virtualization hardware, her pick for most teams; and full VMs or dedicated hosts for regulated work. Sandboxes should be ephemeral, "cattle instead of pets", with hard limits on time and resources. Egress should deny by default behind a proxy, with an allowlist of hosts and HTTP methods and DNS closed; install the dependencies at the start of the session, then lock the network before the agent starts working. And the logs of tool calls, commands and network access go somewhere the sandbox can't reach, next to a kill switch that works mid-session.

That's close to what I built for Forge's workers in my [sandbox inside the sandbox](/notes/openshell-sandbox-inside-a-sandbox.html): the key inside the sandbox is a placeholder that OpenShell's proxy swaps on the way out, and the workers get a second fence with one door, a relay with a host allowlist.

<figure class="fd-fig op op-f4" aria-labelledby="op4-cap" data-desc="Blast radius, in two cards. On the left, agents sharing one environment: a grid of nine agents, one of them compromised, and the injected instructions spread to the agents it works with and into the shared memory, where future agents trust them, until the whole grid is red. On the right, the same nine agents each in its own sandbox, with the keys kept outside: the compromised one stays red alone, and the others stay blue. Under the cards, her four isolation levels from weakest to strongest: containers, which share the host kernel and are not a boundary for untrusted code; a user-space kernel like gVisor; microVMs like Firecracker, each with its own kernel, her pick for most teams; and full VMs or dedicated hosts for regulated work. Her rule: split the brain from the hands, with the harness, state and credentials outside the sandbox.">
<p class="ea-now ea-say4" aria-hidden="true"><span>One agent is compromised</span><span class="ea-no">It passes injected instructions on</span><span class="ea-no">They land in memory, future agents trust them</span><span>Isolated: it stays one</span></p>
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Agents sharing one environment</p>
<p class="mp-two-name">It spreads</p>
<div class="op-grid op-grid-shared" aria-hidden="true"><i class="op-c op-c-r1"></i><i class="op-c op-c-r1"></i><i class="op-c op-c-r2"></i><i class="op-c op-c-r1"></i><i class="op-c op-c-r0"></i><i class="op-c op-c-r1"></i><i class="op-c op-c-r2"></i><i class="op-c op-c-r1"></i><i class="op-c op-c-r2"></i></div>
<p class="op-mem op-mem-shared" aria-hidden="true"><span>shared memory</span></p>
<p class="mp-two-line">Injected instructions pass to its peers</p>
<p class="mp-two-line">They end up in memory for future agents</p>
</div>
<p class="mp-two-vs">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Each agent in its own sandbox</p>
<p class="mp-two-name">It stays one</p>
<div class="op-grid op-grid-iso" aria-hidden="true"><i class="op-c"></i><i class="op-c"></i><i class="op-c"></i><i class="op-c"></i><i class="op-c op-c-r0"></i><i class="op-c"></i><i class="op-c"></i><i class="op-c"></i><i class="op-c"></i></div>
<p class="op-mem op-mem-keys" aria-hidden="true"><span>harness, state, keys: outside</span></p>
<p class="mp-two-line">The blast radius is one agent</p>
<p class="mp-two-line">The proxy adds the key on the way out, one destination at a time</p>
</div>
</div>
<p class="op-day-k"><span class="rp-k">Her four isolation levels, weakest to strongest</span></p>
<ol class="op-levels" aria-label="Four isolation levels, weakest to strongest">
<li><i class="op-lv op-lv1" aria-hidden="true"></i><p class="op-lv-n">Containers</p><p class="op-lv-s">Share the host kernel. Not a boundary for untrusted code.</p></li>
<li><i class="op-lv op-lv2" aria-hidden="true"></i><p class="op-lv-n">User-space kernel</p><p class="op-lv-s">gVisor: its own kernel, in software.</p></li>
<li class="op-lv-pick"><i class="op-lv op-lv3" aria-hidden="true"></i><p class="op-lv-n">MicroVMs</p><p class="op-lv-s">Firecracker: its own kernel behind the CPU's virtualization. Her pick.</p></li>
<li><i class="op-lv op-lv4" aria-hidden="true"></i><p class="op-lv-n">Full VMs</p><p class="op-lv-s">Or dedicated hosts, for regulated work.</p></li>
</ol>
<p class="mp-strip"><b>Her rule</b><span>Split the brain from the hands. "Your kill switch is basically inside the thing you're trying to kill."</span></p>
<figcaption id="op4-cap">The spread is her description drawn, not an incident. The ladder is from her September post; the heights only order the four levels.</figcaption>
</figure>

## A kill switch outside the thing it kills

The last set is the one she calls hard. We need to know these systems are heading in a positive direction, and to catch them and cut them off when they're not. Concretely: OpenTelemetry tracing across agents, with the guarantee that an agent can never modify its own trace or another agent's. And kill switches that monitoring can trigger, that truly stop the whole system at once and cut off its credentials.

The hard part isn't the switch. It's knowing when to hit it. "Well-intentioned persistence to solve a problem can look a lot like maliciousness." Her example: repeated attempts to reach a domain that isn't on the allowlist.

I've seen that ambiguity from both sides. Forge's workers run strangers' install scripts and test suites behind a relay that allows a short list of hosts. If a test fetches a fixture from a host I never listed, the relay refuses it, and refuses the retry. From outside, that worker and an exfiltration attempt write the same log line. The other side: when I stopped using Hermes this summer, my kill switch was revoking its Telegram tokens. By September 14 both of its gateways were crash-looping, retrying tokens that no longer worked. Persistence, not malice, and from the logs alone you couldn't tell.

<figure class="fd-fig op op-f5" aria-labelledby="op5-cap" data-desc="Monitoring and halting, in three parts. One: a trace across three agents, their spans on one timeline, with a lock on it, because no agent may modify its own trace or another agent's. Two: a kill switch that stops all three agents at once and cuts their credentials, drawn as a stop button, three agents going dim and a struck-out key. Three: the ambiguous case, five repeated attempts to reach a domain not on the allowlist, each refused, with two readings under them: a test fetching a fixture, or exfiltration. Her words: well-intentioned persistence to solve a problem can look a lot like maliciousness.">
<p class="ea-now ea-say4" aria-hidden="true"><span>One trace across every agent</span><span>No agent edits a trace, its own or another's</span><span class="ea-no">Stop the whole system, cut its credentials</span><span class="ea-no">Blocked host, retried: persistence or malice?</span></p>
<div class="op-trace" aria-hidden="true">
<p class="op-tr-row"><span class="op-tr-k">Agent A</span><span class="op-tr-track"><i class="op-span op-s1"></i><i class="op-span op-s2"></i></span></p>
<p class="op-tr-row"><span class="op-tr-k">Agent B</span><span class="op-tr-track"><i class="op-span op-s3"></i></span></p>
<p class="op-tr-row"><span class="op-tr-k">Agent C</span><span class="op-tr-track"><i class="op-span op-s4"></i></span></p>
<p class="op-tr-lock"><b>Trace</b><span>read-only to every agent</span></p>
</div>
<div class="op-kill" aria-hidden="true">
<b class="op-stop">Stop</b>
<span class="op-kill-arr">→</span>
<span class="op-kill-ags"><i class="op-ag"></i><i class="op-ag"></i><i class="op-ag"></i></span>
<span class="op-kill-key"><s>credentials</s></span>
</div>
<p class="op-day-k"><span class="rp-k">The ambiguous case</span></p>
<p class="op-retry" aria-hidden="true"><i>GET blocked-host · 403</i><i>retry · 403</i><i>retry · 403</i><i>retry · 403</i><i>retry · 403</i></p>
<div class="rp-pair">
<p><span class="rp-k">One reading</span>A test suite fetching a fixture from a host nobody listed</p>
<p><span class="rp-k">The other</span>An agent trying to send something out</p>
</div>
<p class="mp-strip"><b>Her words</b><span>"Well-intentioned persistence to solve a problem can look a lot like maliciousness."</span></p>
<figcaption id="op5-cap">The spans and the five retries are schematic. The two readings under them are the whole problem: same log, different story.</figcaption>
</figure>

## Where my fleet stands on the four

She closes the article for the engineers who think their skills won't matter: these problems are wide open, and "you and your skills can be the difference". So, honestly, mine.

Infrastructure: one Mac mini, 17 agents, idle most of the day. No scheduler, no fast start, nothing to scale. It works because the fleet is small.

Identity: everything runs as me. The agents use my accounts, and their pull requests are mine on GitHub. Two of them, Nova and Spark, have their own Slack accounts in a workspace just for agents, which is the first piece of an identity. Agent-to-agent trust hasn't come up yet: Telegram doesn't deliver one bot's messages to another, so my agents can't talk to each other there.

Isolation: partial. Forge's workers run in srt, a sandbox runtime on macOS Seatbelt, and on the Dell they'll run in a Landlock cage inside OpenShell, with the keys outside. Every other agent runs its tools on the host, which is OpenClaw's default and the empty row in my [note on NVIDIA's five parts](/notes/hope-isnt-security-enterprise-agents.html).

Monitoring and halting: the weakest row. Meterlex prices every session, but that's a meter, not a trace, and nothing joins one agent's actions to another's. There is no kill switch. Stopping an agent means stopping its gateway or revoking a token, by hand. Forge has a budget of $5 a day, and its Hermes profile on the Dell has a hook that sees every tool call before it runs. That's the closest thing I have to a switch.

<figure class="fd-fig op op-f6" aria-labelledby="op6-cap" data-desc="My fleet held against her four problems, on October 26. Infrastructure: one Mac mini, 17 agents, idle most of the day, no scheduler; it works because the fleet is small. Identity: everything runs as me, and the pull requests are mine on GitHub; two agents, Nova and Spark, have Slack accounts of their own. Isolation: partial; Forge's workers run in srt today and in a Landlock cage inside OpenShell on the Dell next, with the keys outside, while every other agent runs its tools on the host. Monitoring and halting: not yet; Meterlex is a meter, not a trace, and there is no kill switch, only a gateway stopped or a token revoked by hand, plus Forge's daily budget and a tool-call hook.">
<p class="ea-now ea-say4" aria-hidden="true"><span>Infrastructure: one mini</span><span>Identity: all me</span><span>Isolation: Forge only</span><span class="ea-no">Halting: by hand</span></p>
<ol class="ea-card op-cyc4" aria-label="My fleet, problem by problem">
<li><span class="ea-card-k">Infra</span><span class="ea-card-v">One Mac mini, 17 agents, idle most of the day. No scheduler, nothing to scale</span><b class="ea-pill ea-pill-mid">One mini</b></li>
<li><span class="ea-card-k">Identity</span><span class="ea-card-v">Everything runs as me; the PRs are mine on GitHub. Nova and Spark have Slack accounts of their own</span><b class="ea-pill ea-pill-mid">Mine</b></li>
<li><span class="ea-card-k">Isolation</span><span class="ea-card-v">Forge's workers in srt, then a Landlock cage in OpenShell with the keys outside. Everyone else on the host</span><b class="ea-pill ea-pill-mid">Partly</b></li>
<li class="ea-row-no"><span class="ea-card-k">Halting</span><span class="ea-card-v">Meterlex meters, nothing traces. No switch: a gateway stopped or a token revoked, by hand</span><b class="ea-pill ea-pill-no">Not yet</b></li>
</ol>
<p class="mp-strip"><b>Weakest row</b><span>There is no switch. Forge's $5 a day and a tool-call hook are the closest I have.</span></p>
<figcaption id="op6-cap">My own setup on October 26, read against her list. The last row is the one I'd fail first.</figcaption>
</figure>

## Read it

Her article is a few screens long, and it's written for engineers rather than for buyers. Read it for the four headings, then her September post for the sandbox settings, because that one you can act on this week.

If you want more:

- [The new set of problems for engineers to solve](https://x.com/i/article/2114537761030230016), Katelyn Lesse, October 26, 2026
- [Secure agents: architecture and sandboxing](https://www.katelynlesse.com/blog/secure-agents-architecture-and-sandboxing), her September post on splitting the brain from the hands
- [Hope isn't security: the five parts of an enterprise agent](/notes/hope-isnt-security-enterprise-agents.html), NVIDIA's version of the same list, with OpenShell
- [A sandbox inside the sandbox](/notes/openshell-sandbox-inside-a-sandbox.html), Forge's workers behind a relay in OpenShell
- [AI coworkers in Slack need their own identity](/notes/ai-coworkers-slack-agent-identity.html), MintMCP's agents, each its own principal
- [What breaks when an AI agent runs a real business](/notes/what-breaks-when-an-agent-runs-a-business.html), four months of an agent persisting at the wrong thing

If you run more than one agent, pick the row you'd fail first and tell me which. Mine is the kill switch, and I'd like to hear from anyone who has built one that stops a whole fleet and cuts its credentials in one move.
