[{"data":1,"prerenderedAt":107},["ShallowReactive",2],{"blog-en-the-process-was-never-the-boundary":3,"header-blog-translations-\u002Fen\u002Fblog\u002Fthe-process-was-never-the-boundary":104},{"id":4,"title":5,"author":6,"body":7,"date":87,"description":88,"draft":89,"extension":90,"image":91,"meta":92,"navigation":93,"path":94,"seo":95,"stem":96,"tags":97,"translationKey":102,"__hash__":103},"blog_en\u002Fblog\u002Fen\u002Fthe-process-was-never-the-boundary.md","The Process Per Agent Was Never the Boundary","Patrick Hofmann",{"type":8,"value":9,"toc":78},"minimark",[10,14,17,22,25,28,32,47,50,54,57,60,64,71,75],[11,12,13],"p",{},"Every agent was its own process. An OS user, its own supervisor daemon, a bridge process, a persistent socket. With thirteen agents that was roughly twenty-six long-lived processes, each with its own restart logic, its own generated configuration, its own log.",[11,15,16],{},"It felt like cleanliness. Every agent in its own compartment, sealed off from the rest. In fact most of it was overhead that sealed off nothing.",[18,19,21],"h2",{"id":20},"what-the-process-per-agent-cost","What the process-per-agent cost",[11,23,24],{},"The supervisor per agent had to be kept alive. It had a restart cap, and if an agent crashed often enough in quick succession, the supervisor gave up and left it lying — stranded, with nothing to bring it back. The answer to that was never a better supervisor configuration. That treats the symptom. The actual problem is that a crashing agent must not drag the others down, and that's a question of error isolation, not process count.",[11,26,27],{},"On top came the whole machinery around it: for each agent a generated supervisor configuration, a wrapper script, its own daemon state that wanted tending. None of it made a single agent better. It was the price of \"an agent\" and \"a process\" having to be the same thing.",[18,29,31],{"id":30},"what-replaces-it","What replaces it",[11,33,34,35,39,40,43,44,46],{},"Instead of twenty-six processes, one process. The nest holds the agent sessions in the same process — a ",[36,37,38],"code",{},"SessionHost"," that manages a set of running sessions, each conversation in its own ",[36,41,42],{},"ThreadSession",". The ",[36,45,38],{}," reconciles: which agents should exist, which are running, and which are stranded and need restarting. That reconcile is serialized, so two of them don't run over each other, and it repeats on a tick. An agent that fails is caught in its own try\u002Fcatch — it strands alone, not the whole fleet.",[11,48,49],{},"That's the same robustness I expected before from thirteen independent supervisors, only in one place and more directly.",[18,51,53],{"id":52},"why-this-works-at-all","Why this works at all",[11,55,56],{},"The question comes immediately: if all agents run in one process — where's the isolation? Before, an agent's secrets sat only in its process, separated by the OS user that process ran under.",[11,58,59],{},"And that's exactly the error in my thinking. The separation never came from the process. It came from the OS user and the file permissions. The own process was just the place a user context happened to hang on. I can keep the user without keeping the long-lived process — the isolation then moves to where it's actually needed, namely when a tool runs, not while an agent merely waits. How that works concretely is its own topic; here all that matters is: the process was never the thing that separated.",[18,61,63],{"id":62},"that-the-rebuild-is-still-in-flight","That the rebuild is still in flight",[11,65,66,67],{},"This part is a construction site, and I'll write it as one. The single-process path sits behind a switch that's off by default. In real operation the old way still runs, one process per agent. Both ways exist in parallel, behind the same interface, and the code using them doesn't know which is currently active. Only once the new path has proven itself in real operation does it become the default and the old one falls away — there's no day where I flip everything and hope. ",[68,69,70],"span",{},"VERIFY: confirm current default\u002Fcutover status before publishing",[18,72,74],{"id":73},"closing","Closing",[11,76,77],{},"I gave a single agent a whole process because that looked like the clean boundary. It never was the boundary. It sat in the OS user, and that I keep. What falls away is the assumption that \"an agent\" and \"a process\" have to be the same — the same assumption that previously had every agent install its own tooling. One process can hold many. I just never had enough agents to notice the separation comes from somewhere else.",{"title":79,"searchDepth":80,"depth":80,"links":81},"",2,[82,83,84,85,86],{"id":20,"depth":80,"text":21},{"id":30,"depth":80,"text":31},{"id":52,"depth":80,"text":53},{"id":62,"depth":80,"text":63},{"id":73,"depth":80,"text":74},"2026-06-15","I ran every agent as its own operating-system process, supervised by its own daemon. Thirteen agents turned into roughly twenty-six long-lived processes. A note from a rebuild that's still in flight — and from realizing that the isolation I credited to the process sat somewhere else.",false,"md",null,{},true,"\u002Fblog\u002Fen\u002Fthe-process-was-never-the-boundary",{"title":5,"description":88},"blog\u002Fen\u002Fthe-process-was-never-the-boundary",[98,99,100,101],"OpenApe","AI Agents","Infrastructure","Building in Public","the-process-was-never-the-boundary","usULrePpfkfnS7SEtpnlMTTE7pq4d4zvait75qjJgKA",{"en":105,"de":106},"\u002Fen\u002Fblog\u002Fthe-process-was-never-the-boundary","\u002Fde\u002Fblog\u002Fder-prozess-pro-agent-war-nie-die-grenze",1781706959552]