The Cheapest Wrong Turn in an Assistant-Shaped Product
Adding an assistant to an app is a few dozen lines. A provider key, a system prompt, a message array, a place to keep the history. Every surface that wants one can have one by lunchtime, and that is precisely the problem: the code is trivial and the consequences are permanent.
What a second brain actually creates is a second set of canonical facts. A conversation history that exists only here. A model choice that has to be changed in two places. A persona defined twice and drifting. None of that is visible on the day you add it, and all of it is expensive to unwind a year later once real conversations live on both sides.
Name the Owner, Then Bind to It
The alternative is to declare one canonical owner of identity, conversations, memory and routing, and make every other surface a client of it. A conversation started in the reader is an ordinary conversation belonging to that owner, addressable by a context key — this article, this shelf, this brief — and continuable from anywhere else that talks to the same owner.
The test for whether the boundary is real is simple: can a conversation begun here be continued somewhere else? If yes, you have a client. If it can only be continued here, you have a second brain wearing a client's name, whatever the architecture diagram says.
Keys Live With the Owner
The same argument settles credentials, and more sharply. Provider keys belong to the canonical owner, and a sibling surface that needs a capability calls a narrow internal route rather than holding a key of its own. Two reasons, and the second is the one people underrate: the obvious one is that a secret in one place is a secret in one place. The subtler one is that usage accounting stays whole — spend from every surface lands in one ledger, so the question "what did this cost us?" has a single answer instead of being assembled from several partial ones.
Narrow the Door
A shared internal route is a capability, so it should be as small as the job requires. One-shot completion, no conversation created, no tools, no shell, no persona unless explicitly requested. If a sibling later needs something with tools, that is a different door with its own scope — not a parameter on this one. A generic door with an ever-growing parameter list eventually offers every capability to every caller, which is the same failure as everyone holding a key, arriving more slowly.