Memory, Routing, and Bounded Ownership in Agent Teams

Agentic DevelopmentOpenClawMulti-Agent SystemsEngineering

I run a few agents at once. One handles content, one handles code, one handles routine ops. They each have their own preferences, their own tone rules, their own memory of what’s already been done.

When I let them share too much, the work gets worse, not better. The site builder picks up a phrasing rule that belonged to the email pipeline. The growth agent quotes a stale assumption from a customer thread. Nothing’s catastrophically wrong, but the lanes blur, and “more context” stops feeling like coordination.

In Operator Control for Agentic Systems, I argued that production-worthy agent systems need visible work, clear ownership, approval points, and intervention paths. The real product layer is operator trust.

That gets harder, not easier, when more agents are involved. A single agent with too much hidden context is already difficult to trust. A group of agents sharing everything with everyone can be worse: more context starts to feel like coordination, but it often creates the opposite. Unclear ownership. Stale assumptions. A system no one can debug because the failure isn’t in the prompt or the tool, it’s in the context that got pulled in for reasons nobody decided.

The better pattern is bounded ownership: memory has an owner, work has an owner, routes are explicit, and handoffs preserve operator visibility instead of dumping every context into every agent.

Shared-context trap vs bounded ownership Two panels show the same four agents under two operating models. The top panel, the shared-context trap, places a dark slate blob labeled "shared context" at the center with four agent nodes around it. Bidirectional arrows connect every agent to the blob, annotated with stale assumption, leaked preference, and ambient influence. The bottom panel, bounded ownership, places an operator surface at the top, a purple routing layer in the middle, and four agent lanes below. Each lane is wrapped in a violet dashed boundary representing scoped memory, and an explicit arrow flows from the routing layer into each lane. Shared-Context Trap vs Bounded Ownership More context isn't more coordination · ownership is what makes agent teamwork inspectable Shared-context trap Everything is available. Nothing has an owner. shared context every preference · every workflow · every prior decision site rules growth notes customer notes tool prefs stale assumptions Builder agent site, content Growth agent positioning Support agent customer reply Ops agent workflows, tools stale assumption leaked preference cross-lane influence ambient context drag Bounded ownership Each lane owns its memory. The routing layer decides who handles inbound work. operator · sees routes & handoffs inbound new task / message routing layer classifies inbound · dispatches to owner · filters context per route scope · site memory Builder agent site, content site_rules.md · voice.md scope · growth memory Growth agent positioning positioning.md · audience.md scope · support memory Support agent customer reply tickets.md · escalations.md scope · ops memory Ops agent workflows, tools workflows.md · runbooks.md Legend Agent Routing layer Scoped memory file Operator surface Lane / memory boundary Shared blob (trap)
Figure 1. The same four agents under two operating models. Shared-context trap (top): every agent pulls from and writes to one blob, and "more context" turns into stale assumptions, leaked preferences, and ambient influence across lanes. Bounded ownership (bottom): each agent has a scoped memory, a routing layer decides who owns inbound work, and the operator can see the routes and handoffs.

How to read this diagram. Two panels show the same four agents under two operating models. On top, the shared-context trap: a dark blob in the middle labeled “shared context” holds everyone’s preferences, workflows, and prior decisions. Each agent pulls from and writes to the same blob, and chaotic bidirectional arrows tell you nothing about who owns what. The annotations name what tends to leak: stale assumptions, leaked preferences, ambient influence, cross-lane drag. Below, bounded ownership: the same four agents sit in scoped lanes, each wrapped in a violet dashed boundary that represents that lane’s memory scope. A purple routing layer sits between inbound work and the lanes, and the operator surface at the top of the panel can see which lane handled what and why. Both panels have four agents; the difference is whether anyone owns anything.

The shared-context trap

The tempting move in a multi-agent system is to make every agent aware of everything. Give the builder agent all the product history, give the growth agent all the engineering context, give the support agent every customer note, give the ops agent every workflow and prior decision. At first, this feels powerful. Nobody is missing context, every agent can answer more questions, the system feels less brittle because the context window is full.

That fullness has a cost. When every agent has access to everything, responsibility gets blurry. An agent starts using stale information from another lane. A specialized task gets influenced by irrelevant background detail. A memory that should belong to one product or workflow quietly shapes another. Debugging gets harder because the failure might not be in the prompt, the tool, or the model. It might be in polluted context, and polluted context doesn’t surface as an error.

More context isn’t the same as better coordination. Coordination requires boundaries.

Context is not memory

One distinction matters a lot here: context is not memory.

Context is what the model sees during a single run. It’s temporary, bounded, and shaped by whatever the system chooses to include this turn. When the run ends, the context goes with it.

Memory is what the system writes down for later. It lives in files, scoped stores, or workspaces the system controls, and it’s recalled through explicit tools rather than pulled in by ambient gravity. Useful memory has an owner.

That matters because memory shouldn’t be a universal dumping ground. The question isn’t just should the system remember this. It’s also: who owns this memory, which agent or workflow should be allowed to use it, is it durable or only useful for the current task, should the operator approve it before it’s saved, when should it be updated or removed. Those are product questions, not prompt-writing details. Without an owner, memory becomes ambient influence: hard to inspect, harder to trust.

Context vs memory: the boundary that makes the system inspectable Two stacked sections separated by a violet dashed boundary line labeled as a product choice. The top section shows run-time context in blue: prompt input, tool call history, retrieved snippets, and system instructions, with annotations naming it as ephemeral, bounded to one run, and dying on completion. The bottom section shows persisted memory in purple: workspace files, scope rules, durable preferences, and approved facts, with annotations naming it as owned, reviewable, scoped, and decaying explicitly. The boundary itself is the point: context flows in and out per run, memory is written down and recalled through explicit tools. Context Is Not Memory Run-time context dies with the run · persisted memory is written down, owned, and recalled through explicit tools Context · run-time What the model sees during a single run. Bounded by the window, shaped by what the system includes. prompt input user message, current instruction in for this turn only tool call history what was tried, what came back scrollback within the run retrieved snippets docs, references, just-in-time facts pulled per turn, not kept system instructions role, rules, tool definitions re-injected each call Properties • ephemeral: dies on completion • bounded: fits in the window • composable: system decides what to include • opaque to next run Where context lives In the call. In the window. Mixed into whatever the system chooses to send this turn. Reusing context across runs requires writing something down. The boundary that makes the system inspectable Memory · persisted What the system writes down. Scoped, owned, reviewable, recalled through explicit tools. workspace files memory/*.md inspectable by humans written down, not hidden state scope rules which lane this memory belongs to ownership is named durable preferences voice rules, defaults, tone, safety lines survives runs and sessions approved facts decisions the operator confirmed reviewable, removable Properties • owned: a lane is responsible • reviewable: humans can see it • scoped: recall is explicit, not ambient • decays explicitly: updated or removed Where memory lives In files, scoped stores, or workspaces the system controls. Pulled into context only when the route asks for it. The operator can read what's there. Legend Context surface Memory store Persisted artifact Context/memory boundary
Figure 2. Context is not memory. Context (top) is what the model sees during one run: prompt, tool history, retrieved snippets, system instructions. It dies on completion. Memory (bottom) is what the system writes down: files, scope rules, durable preferences, approved facts. It's owned, scoped, and reviewable. The violet boundary between them is a product choice, not a default.

How to read this diagram. Two stacked sections separated by a violet dashed boundary line. On top, context in blue: prompt input, tool call history, retrieved snippets, system instructions. The properties strip on the right names what context is: ephemeral, bounded to one run, composable per turn, opaque to the next run. Below, memory in purple and lime: workspace files, scope rules, durable preferences, approved facts. The properties strip on that side names a different set: owned by a lane, reviewable by a human, scoped (recall is explicit), decays explicitly when updated or removed. The boundary line in the middle is labeled as a product choice on purpose. The system can be built either way; this is the choice that makes the memory inspectable.

Product-owned memory

I use “product-owned memory” as an architecture idea. Some information belongs to a product. Some belongs to a workspace. Some belongs to an agent. Some belongs to a workflow. Some should stay temporary and never become durable memory at all.

A site builder agent may need durable facts about the site’s publishing rules, voice, content structure, and approval boundaries. A growth agent may need positioning patterns, distribution preferences, and audience notes. A control agent for a multi-agent setup may need implementation facts, docs paths, and operational caveats.

Those memories shouldn’t collapse into one global blob just because all the agents are working for the same operator. The point isn’t secrecy for its own sake. It’s relevance, ownership, and reviewability. If a memory affects public writing, I want to know where it came from and which lane owns it. If a memory affects tool permissions or operational behavior, that boundary needs to be even clearer.

A multi-agent system gets easier to trust when memory has a home.

Specialist agents need lanes

The same principle applies to agents themselves. A growth agent, a builder agent, a support agent, and an ops agent shouldn’t be the same general assistant wearing different labels. Each one needs a lane.

That lane should include:

  • what kind of work it owns
  • what memory it can rely on
  • what tools it should use
  • what claims it’s allowed to make
  • when it should escalate
  • when it should hand work to someone else
  • what it shouldn’t touch

I like the “desk” metaphor for this. A desk has a job. Work comes in. The desk either handles it, routes it, or escalates it. It doesn’t pretend to own everything. That makes the system more legible for the operator. If a content draft is weak, I know which lane produced it. If a product claim needs verification, I know which lane should review it. If a workflow is blocked, I can tell whether it’s a routing issue, an ownership issue, or a missing approval.

Specialization without ownership is just more agent names. Specialization with ownership starts to become an operating model.

Routing is where ownership becomes real

Routing isn’t just a convenience layer. Routing is where the system decides who owns the work.

A useful routing layer should answer practical questions. What kind of work is this? Which agent or desk owns it? What context does that agent need, and what context shouldn’t be passed along? Is this a new task, a continuation, or a handoff? Does the operator need to approve the route? What happens if the route is ambiguous?

In a system built this way, agents have separate workspaces, state, sessions, and bindings. Inbound work gets routed by rules. Cross-agent memory access is explicit, not automatic. That matters because it keeps coordination from turning into accidental context sharing. Routing should make ownership clearer, not hide ownership behind a smoother interface. If work moves from one agent to another, the operator should be able to understand why.

Routing decision flow A state machine showing how inbound work becomes owned work. Inbound work in cyan enters from the left, hits a classify step in blue, and branches into three paths. The top path, route to owner in purple, leads to handle in lane in blue and ends at complete in lime. The middle path, ambiguous in amber, leads to operator review in red and loops back to classify. The bottom path, no owner in amber, leads to escalate or create lane in red. Side annotations name two invariants: context is filtered per route, and the operator has visibility on every edge. Routing Decision Flow Inbound work · classify · route · branch on ambiguity · operator visibility on every edge Invariant · context per route Each route filters context for the receiving lane. No ambient sharing. Invariant · operator visibility on every edge Every transition surfaces who handled it, when, and why. inbound work new task or message request · event · prompt classify what kind of work who should own it rules · types · matchers route to owner context filtered for lane lane = builder · growth · etc. handle in lane scoped work happens uses lane memory only complete artifact produced handoff or done owner identified ambiguous multiple lanes could own it judgment required operator review approve route · pick lane approve · redirect · split re-route with operator decision no owner no lane exists yet novel work pattern escalate create lane · reassign · defer operator decision no lane matches 👁 visible 👁 visible 👁 visible 👁 visible Legend Inbound / external Automated step Owned route Judgment / branch Operator gate Completed artifact Invariant strip
Figure 4. Routing decision flow. Inbound work hits a classify step that branches into three paths: owner identified routes the work to the right lane with filtered context, ambiguous hands the route decision to the operator and loops back, and no owner escalates to the operator who can create a lane or reassign. The two invariants across the top hold for every transition: context is filtered per route, and the operator has visibility on every edge.

How to read this diagram. Inbound work enters from the left and hits a classify step in blue, which decides what kind of work it is and who should own it. From there, three branches. The top, owner identified, routes the work to a specific lane in purple with context filtered for that lane, then the lane handles it, then it completes with an artifact. The middle, ambiguous, hands the route decision to the operator in red (approve, redirect, or split) and loops back to classify with the operator’s decision. The bottom, no owner, escalates to the operator who can create a lane, reassign, or defer. The two invariants across the top hold for every transition: context is filtered per route, and the operator has visibility on every edge.

Handoffs shouldn’t be context dumps

A bad handoff says here’s everything, good luck. A better handoff names what’s being transferred, why another agent is needed, what’s already happened, what context is relevant, what context is intentionally excluded, what output or decision is expected, and what approval boundaries still apply.

Anatomy of a good handoff A schematic handoff card in the center divided into five labeled rows. The header row names the source and target agents with an arrow between them. Row one names why the handoff is happening. Row two summarizes what was already done with an artifact pointer. Row three shows the context filter, listing items to include in green chips and items to exclude in dashed gray chips with reasons named below. Row four names the expected output as a single gov-purple chip. Row five names the boundaries that still apply, including a red approval gate and an orange operator intervention pill. Side annotations on the left and right point to specific rows and explain why each carries weight. A contrast strip at the bottom shows a bad handoff in dark slate and a good handoff in purple. Anatomy of a Good Handoff What crosses the boundary when one agent hands work to another · schematic, not a UI mock handoff task crosses the boundary Builder agent Growth agent 1 · Why this handoff Growth lane owns positioning copy. Builder doesn't claim that lane; passing the rough draft over. 2 · What was already done drafts/launch-copy.md · v1 saved 3 versions tried · final attempt stored with notes 3 · Context filter Include draft v1 voice rules intended channel Exclude site publish rules customer notes tool prefs not relevant · different lane · private to ops 4 · Expected output growth-voice draft v2 ready for operator review 5 · Boundaries still in effect approval before publish operator: pause · redirect · narrow The handoff narrows the work, not the safety boundary. Approval and intervention still apply across the boundary. Named on both sides Source and target are specific agents, not "the next step" or "another assistant." Reasoning, not just dispatch Tied to why this agent doesn't own the work, so the receiving lane can verify the route. Include what's needed. Exclude on purpose. Naming what gets left out, and why, is what stops cross-lane influence from leaking through the handoff. Filter is part of the spec. Artifact pointer, not retelling The receiving agent reads the artifact; it doesn't reconstruct prior work from prose. Named deliverable The receiving agent knows when it's done. "A growth-voice draft" beats "something to use." Safety boundaries don't transfer away Approval gates and the operator's intervention path persist across the handoff. The boundary moves with the work, not against it. Two shapes a handoff can take "here's everything, good luck" · next agent reconstructs the work scoped · named · reviewable · next agent picks up the artifact Legend Agent badge Include chip Exclude chip Approval gate Operator intervention Expected output
Figure 3. What a good handoff communicates. Source and target named on both sides, the reason for the handoff, the artifact already produced, an explicit context filter (include / exclude with reasons), a named deliverable, and the boundaries that still apply (approval before publish, operator pause / redirect / narrow). The bottom strip names the contrast: a bad handoff dumps everything across; a good handoff scopes, names, and stays reviewable.

How to read this diagram. A schematic handoff card in the center, divided into five rows. The header names the source and target agents (Builder agent on the left, Growth agent on the right) connected by an arrow so direction is legible at a glance. Row 1 names the reason for the handoff. Row 2 points to the artifact that was already produced, so the receiving agent doesn’t reconstruct prior work from prose. Row 3 is the context filter, with green chips for what gets included and struck-through chips for what gets excluded, with reasons named under the strikes. Row 4 names the expected output as a single purple chip. Row 5 names the boundaries that still apply: a red approval gate and an orange operator intervention pill. Side annotations point to specific rows and explain why each carries weight. The strip at the bottom names the contrast: a bad handoff dumps everything across, a good one scopes, names, and stays reviewable.

In a multi-agent system, handoffs are where a lot of trust is either preserved or lost. If the handoff is too thin, the next agent reconstructs the work. If it’s too broad, the next agent inherits noise. If it’s invisible, the operator can’t tell who owns the next decision.

A good handoff names what’s transferred, why another agent is needed, what’s already happened, what context is relevant, what context is intentionally excluded, what output is expected, what approval boundaries still apply, and where the operator can intervene. That isn’t bureaucracy. It’s how agent teamwork becomes inspectable. The operator shouldn’t have to guess whether the second agent understood the first agent’s intent.

The memory boundary is also a safety boundary

Memory isn’t only a quality feature. It’s also a safety boundary.

If an agent saves the wrong thing, that mistake can keep influencing future work. If a private detail leaks into the wrong lane, it can shape outputs where it doesn’t belong. If a temporary preference becomes durable memory, the system starts acting as if a passing instruction was a permanent rule.

That’s why I don’t want memory to feel magical. I want memory to feel owned. Some memory updates are low-risk and clearly scoped. Higher-impact durable memory should be proposed, reviewed, or approved.

This connects directly to operator control. The operator doesn’t need to approve every token. The operator should have visibility and control around durable context that changes how the system behaves later.

The operating model

The pattern this points to is simple:

  • scoped agents instead of one universal assistant
  • memory written into inspectable workspace files instead of hidden model state
  • explicit memory access instead of automatic cross-agent recall
  • routing rules that decide who owns inbound work
  • task and workflow layers that make work easier to inspect
  • operator-visible handoffs when ownership changes
  • approval points around durable memory, external action, and risky changes

I’m working through this in OpenClaw and a multi-agent projects. the principles don’t depend on any one platform. The goal isn’t to make every agent know everything. It’s to make the right agent own the right work with the right context at the right time.

The principle

Part 1 was about operator control. This part is about what operator control requires when agent work becomes team-based.

More context isn’t the same as better coordination. Agent teams become trustworthy when each agent has a lane, memory has an owner, routing is explicit, and handoffs preserve operator visibility.

If you’re building agent teams, decide who owns memory, who owns the work, and how handoffs happen before you add more context. Otherwise you aren’t building a team. You’re building one giant shared context blob with extra names.


Discussion

Comments powered by GitHub Discussions. You'll need a GitHub account to participate.