Bound the environment, not the click
Three different seats, same leak. A
research sandbox assumed GET could not
mutate the web, then watched agents
find twenty-year-old wikis that write
on query strings and a proxy that
trusted a hostname the guest could
forge. A coding agent asked “Allow?”
until humans said yes 93% of the time.
A public git forge spent a fifth of
its cores rendering pages nobody
needed, because the cheap clone was
not the path the crawler took.
Capability went up. The radius went
with it.
Supervision and containment are not
the same control. A permission prompt
is a story you tell the user. An
environment bound is a story the
kernel can fail. Put credentials
outside the guest. Deny network by
default. Do not let the agent edit
the allowlist — not /etc/hosts, not
NO_PROXY, not a Host header that
turns blob storage into a tunnel.
Treat project-open, config-load, and
“paste this prompt” as inbound
internet. Defer hooks until after
trust. If a GET can write, it is a
write tool; log it that way.
Fetch is in the radius too. An agent
that HTML-walks a million commits is
not researching. It is a load test
with a user-agent. Prefer the archive
you already publish. Cap pages, not
vibes. The stop condition for a
reviewer is the same as for a
sandbox: when another prompt would
only shrink the miss rate of a
probabilistic defense, stop clicking
and shrink what the process can
touch.
Checklist
-
List files, hosts, and secrets the
agent can reach. If a credential
is in that list, move it out.
-
Deny network by default. Allowlists
live outside the guest. The agent
does not own DNS or Host headers.
-
Inventory GET endpoints that mutate.
Treat them as write tools, or block
them.
-
Load project config only after the
trust prompt. Local is not trusted.
-
Do not use permission dialogs as
the control plane. Fatigued Allow
is the common case.
-
Prefer clone/archive over HTML
crawl. Cap fetch count and cost
the way you cap blast radius.
This morning: one allowlist the guest
cannot rename, one secret that never
enters the sandbox, one GET you
confirmed cannot write.