Jul 23, 2026
Why Your Agents Are (Should Be) Keeping Secrets From Each Other
Hi! It's been a while.My advisor says a paper is done when you would rather do anything than open the file again. By that measure I finished two: one on delegated play, one on the economics of ideas. The first is on arXiv now; the second will be by the end of the month. When I told him, he asked (warmly ... I hope!) whether the blog had died.Thanks for reading! Subscribe for free to receive new posts and support my work.It had not. It was defrosting. And it's back!The agents did not take the hiatus off. Dube International runs agents for two companies selling into adjacent markets. One shared model drafts outreach for both, from the same skill library and the same memory. In a year when every vendor demo ships with an agent, ours holds down two jobs, no benefits, no complaints.It's an appealing idea. Every correction a human makes to one client's agent improves the model that runs all of them. However, it is also a data leak. For a correction on the first account to help the second, something has to cross the boundary between them. The question I keep returning to is what crosses, and what never does.What actually crossesThe production pattern is dual-tier memory. Each agent keeps private fragments, local to its deployment. A shared tier holds the fragments that cross agents, each carrying immutable provenance. MIRIX, published in July 2025, splits memory into six components and enforces access control across them rather than treating memory as one store. Each component forces the same question: what may leave the agent.The Vault is the strictest tier. Relevance does not move it. Access control there is not a filter run after retrieval; it is a property of the store. (For those keeping up with Silicon Valley, this is also the description of what a Claw looks like. In the past, we've done an overview of the context engineering behind OpenClaw).Most of what an agent knows is not allowed to leave. The draft it wrote, the account it targeted, the reply it got: private. What we promote to the shared tier is never the message a human fixed. It is the judgment the fix implies, stripped of the content that occasioned it.Take a case. A reviewer rewrites an agent's draft to an owner-operated transport company, cutting a paragraph that assumed the owner had a dispatcher. The private fragment is the draft and the account. The shared fragment is smaller and duller: do not assume staffing you have not observed. Dull is the point; dull generalizes, and a lesson with no client attached is a lesson you can reuse. Its provenance points at the correction event, not the client record. The second client's agent never sees the first client's message. It inherits the judgment the message earned.Procedural memory is the cleanest case. LEGOMem, from October 2025, treats corrected skills as modular units that transfer across a multi-agent pipeline. A skill is already content-free (very loaded word, maybe someday we will discuss further); it is a way of doing a thing, not a thing that happened to a client. When the unit you share is a skill and not a record, the boundary holds without anyone watching it.Provenance turns this from hopeful into auditable. Temporal knowledge-graph systems such as Zep attach time and source to every fact, so a shared judgment traces back to the human decision that produced it without dragging the private data along. That trail is also the reward signal. A correction is worth propagating only if you can find out later which corrections propagated well.Links are not boundariesThe provenance trail needs somewhere to live, and the field has mostly converged on a shape. Google's Open Knowledge Format is the cleanest statement of it, standing in for a family of flat, file-based knowledge stores: markdown files, YAML frontmatter for metadata, and a graph implied by the links between documents. A single file looks like this:--- id: acme-q3-forecast type: analysis author: t.dube created: 2026-07-19 sources: [acme-crm-export, acme-call-notes] --- The Q3 pipeline weakened after the pricing change. See [the pricing decision](./acme-pricing-change.md) for the trigger. The metadata sits in the frontmatter, the body carries the claim, and the link to acme-pricing-change.md is the edge in the graph. It wins for reasons that hold: the files are human-readable and portable, they need no database, and the graph costs nothing because a link is one line. A reviewer can read a fragment, and so can grep.What the format cannot do is hold the boundary. A link says two documents are related, not which of them may cross to a competitor's agent. The tier a fragment belongs to is a field in the YAML, and a field is a convention. Nothing in the format stops a retrieval step from reading a private fragment and promoting it; the convention holds only as long as every reader honors it. That is the failure we started with, moved down one layer. A filter applied after retrieval is not access control, because the data has already been read.Picture a shared office with one filing cabinet and no locks. Every folder wears a sticker. Some say SHARED. Some say PRIVATE, ACME ONLY. The system works as long as everyone who opens the drawer reads the sticker and obeys it. Then the office hires a temp who is fast, tireless, and does not read stickers, and the cabinet has no opinion about that. A sticker is not a lock. It is a request. The tier field in the YAML is that sticker, and a retrieval pipeline is the temp: it opens folders thousands of times a day, by relevance, at speed, with no one watching.Here is the failure in motion. Client A's agent holds a private fragment:Acme is cutting prices 15 percent in Q3, stop leading with premium positioning. A query from client B's agent, selling into the same market, matches it, and of course it does; the fragments that score highest across competitors are exactly the ones about the market they share. The retrieval step reads it, the model folds it into a draft, and client B's outreach lands in a prospect's inbox knowing something only client A told anyone.No one decided to leak it. Every component did its job, which is the unsettling part. If you run agents for two competitors, sit with that email: it reads like it was written by someone who has seen your other client's books, because in every way that matters, it was. That is not an edge case. It is the default behavior of a store that keeps the boundary in metadata.The problem is mechanism design, not storage. I cannot audit every retrieval, the same way I cannot read every draft before it sends. A boundary that holds only when each reader chooses to honor it is not a boundary. It is an agreement, and an agreement among readers is the thing I am trying not to depend on. The mechanism-design question is narrow: build the store so the leak is not an event you catch but a state the store cannot represent. Not a rule with a penalty. A move the board does not accept.The answer I have settled on is a typed hypergraph.What is a typed hypergraph?Start with the graph you already know from the OKF example: notes on a corkboard, string between pairs. One string, one relation, two things. The forecast cites the pricing change. That works until you try to pin up a promotion, which is not a pair. A promotion is one event with four parts that only mean anything together: the judgment being shared, the correction that produced it, the human who signed it, and the tier it may enter. String those up pairwise and the event shatters into four separate strings that nothing holds together. Pull one and the others do not notice. Two years later the judgment is still in the store, the signature has drifted three links away, and a client asking who approved the thing their competitor's agent learned gets a reconstruction instead of an answer.A hypergraph fixes the geometry. A hyperedge is one string that loops through all four notes and binds them into a single fact, which exists whole or not at all.Typed is the word with teeth. Nodes carry types: judgment, content, correction event, client, agent. Edges carry types too, and a type is not a label. -- Easy way to think about this? Types just give nodes and edges a meaning, it's like having color-coded strings and pins, and the colors mean something :PIt is a rule the store enforces, the way a database refuses to put a word in a number column. One promotion becomes one typed edge recording the judgment, the correction behind it, the human who signed it, and the tier it may enter. The tier stops being a YAML field and becomes a property of the edge.Rerun the pricing scenario in this store. The Acme fragment is a content node, typed private. Client B's query matches it, the retrieval reaches for the node, and the store refuses before anything is returned. There is no draft with the leak in it, no filter to check, no incident to write up, because the leaking retrieval was never a thing the store could express. It is a type error. If the boundary between clients lives anywhere a reader can decline to check it, I do not have a boundary, I have a hope with a schema. The office threw out the stickers and welded a wall through the cabinet.Why a hypergraph, and why not. The case for it is above, one line per row. The case against it is real, and worth stating before you buy the database:The honest answer to "why not a hypergraph" is that most of the time you should not. If every agent sits inside one trust boundary, you have no boundary to enforce, and the flat store hands you a 30 percent gain with none of this overhead: greppable, database-free, readable by a human on a bad day. The hypergraph is not the better store in general. It is the store you switch to the moment a leak across clients becomes possible, because that is the moment the graph stops being free anyway. You pay for the boundary either way. The only question is whether you pay in schema or in incidents.When to sync, and how you would knowSharing is neither free nor instant. Recent work on distributed agents has measured the tradeoff: long-term memory costs more but improves accuracy. Memory is a line item. For latency-sensitive work, use distributed shared memory with periodic sync: agents run on local state to stay fast, and reconcile against shared state on a slower loop to stay correct. MemGraphRAG uses a global knowledge-graph layer for this, keeping cross-agent answers consistent on the multi-hop queries that naive retrieval gets wrong. In our version the agent drafts from private memory in real time, and promotion to the shared tier happens off the hot path, gated the way outputs are gated. LangGraph implements the gate as an interrupt, a human checkpoint before state commits. A bad draft costs one send; a bad shared judgment costs every agent that later retrieves it.Measurement is the part the field has not solved.What resists scoring is that last row: the value of a shared fragment before it has fired anywhere. Contribution attribution traces which agent's correction improved which other agent's result, and is becoming a standard metric for that reason. The cross-client improvement stays invisible until you instrument it. I can claim it when I can point to the specific correction from the first client that raised the auto-approve rate on the second, and not before.TL;DR: The unit you shareKeep two tiers. The private tier holds everything that happened; the shared tier holds only what it taught you. Content identifies and judgment generalizes, so promote the lesson and leave the case file where it lives. Staple a provenance trail to every shared fragment so you can name the human who approved it, ideally before a client asks.Store it in a typed graph, not a flat pile of markdown with a PRIVATE sticker in the frontmatter. A sticker is a request, and your retrieval pipeline is a temp who does not read requests. In a flat store, access control is a promise every reader has to keep, which means it is not access control. In a typed store, a leaking retrieval is a type error the store refuses before it returns anything. Build the boundary into the types, or accept that what you have is a hope with a schema.Thank you for reading, pls subscribe if you haven't, tell your friends, families, neighbours, and nemeses; and I'll see you soon!!