We don’t prompt our way to safety
Most of the conversation about agent safety is about the agent: how to make it unwilling to do the wrong thing. That work matters and we depend on it. But a Busy teammate is fenced somewhere else entirely — at the gateways it has to pass through, using the same permission machinery that has governed enterprise software for a decade. Nothing about its safety rests on it choosing well.
The labs work on the agent. We work on the gateway.
There is a good reason the frontier labs focus where they do. They ship a model to everyone, in every context, with no idea what it will be pointed at, so the only lever they have is the model’s own disposition. They spend enormous effort making it decline harmful instructions and resist manipulation, and they are getting better at it every release.
We are downstream of that work and glad to have it. But we build for one company at a time, doing known jobs, in named systems — which means we have a lever the labs do not: we can decide what is reachable at all. That is a different kind of control, and it composes with theirs rather than competing.
The practical difference is what happens on a bad day. If the control lives in the instructions, a bad day is a model that was talked around, and the action goes through. If the control lives at the gateway, the model can be fully convinced and completely wrong, and the action still does not go through, because nothing in its reach can perform it.
Keep the model from going around the controls
The labs work on disposition: refusing harmful instructions, resisting injected content, declining to circumvent a restriction it was given. That work is real and we benefit from all of it.
Set the controls in the first place
One layer up, and the layer almost nobody is building. Every action a teammate takes passes through a gateway that decides — deterministically, outside the model — whether it is permitted. If the answer is no, the action is not refused. It is unavailable.
The account boundary you already trust
Google, Dropbox, QuickBooks and the rest have enforced per-user permissions for years. A Busy teammate is a user, so it inherits every one of those controls without us inventing anything.
A machine of its own
Each teammate runs on dedicated hardware it does not administer. It cannot edit its own source: changes ship as reviewed pull requests with CI, the same as any engineer's.
The dangerous mistake is not the inaccurate one
When people picture an agent failing, they usually picture it being wrong. It was told to refund a customer $12 and it refunded $20, because it decided sales tax was part of the order total. That is a context error. Human employees make it constantly, it is caught in the ordinary course of business, and it is not where the real exposure is.
The exposure is in scope. The failure that hurts is the one where the amount was perfectly correct and the agent applied it to all forty thousand customers. Where you approved deleting three records and the instruction was read as the table. Where “go find us more revenue” became outbound email to every address it could reach.
This follows directly from what computers are good at. We hand them the repetitive work because they will do the same thing ten thousand times without flagging, and that willingness does not distinguish between ten thousand correct executions and ten thousand copies of one misunderstanding. So the thing worth engineering is not the agent’s accuracy. It is the size of the hole a single mistake can fit through.
It got the amount wrong
You asked for a $12 refund and it issued $20, because it believed tax and shipping were included. A new hire makes this mistake in their first week. It is a context error, it is visible, and it costs $8.
It got the scope wrong
The amount was right. It refunded $12 to every customer you have ever had. Or you said "yes, delete them" about three rows and it read that as the table.
One of these is a computer problem
Software is worth having precisely because it will do the same thing a million times without getting bored. That is the same property that turns one misread instruction into a million executions of it.
A permission is a fact about the system. An instruction is a hope about the model.
A Busy teammate has its own accounts
This is the difference that does the most work, and it is the one most easily missed because it sounds like an implementation detail. Almost every AI product that touches your real systems uses delegated access: you authorize it, and from then on it acts inside your account, as you. Your Gmail. Your Dropbox. Your audit log, with your name on every line it wrote.
A Busy teammate gets a seat instead. Roan has his own Google Workspace account at your domain and his own Dropbox under it. People share folders with him the way they share with any colleague, and that sharing isthe grant. There is no scoping configuration to get right, because the account boundary is already the fence — the same fence that keeps your Dropbox and your colleague’s Dropbox separate without either of you thinking about it.
It also makes the vendor’s own permission system available to you. Seller Central has a long list of per-section toggles; Google and most SaaS have read-only, editor and admin; QuickBooks has a read-only accountant role. A teammate that logs in as itself is subject to every one of those the moment you set them, and you set them in the vendor’s own settings screen, not in ours.
We do support delegate access, because the genuine executive-assistant case exists — sometimes a teammate really does need to see the principal’s own inbox. When that happens it is additive and explicit: the teammate already has a seat, delegate access is granted on top of it, it is labelled as delegate on the connection, and it is the one case where scoping is required rather than optional. What we will not do is make delegation the default and call the resulting confusion a feature.
| Question | Seat — how Busy works | Delegate — how most AI works |
|---|---|---|
| Whose account is it | Its own. roan@stratusdevelopers.com has a Dropbox the way any employee does. | Yours. It acts inside your account, as you. |
| What is the fence | The account boundary. People share folders in, and the sharing is the grant. | Whatever scoping was configured. If nobody configured any, there is none. |
| Who did that | The audit log names the teammate, because the teammate signed in. | The audit log names you. |
| How do you revoke it | Unshare the folder, or suspend the seat. Same as offboarding a person. | Revoke a token and hope nothing else was riding on it. |
| Does anyone need it explained | No. Everyone already knows their Dropbox and a colleague's Dropbox are different things. | Yes, every time, and the explanation is never quite reassuring. |
A corporate spend card, with the controls turned on
Our own teammates carry a corporate spend card. It has a monthly limit, a merchant category list and a per-transaction cap, set the same way you would set them for a new hire — which is the entire answer to “what stops it from spending everything.” Nothing about that mechanism is new, and that is the point of using it.
QuickBooks access as a read-only bookkeeper
A teammate doing month-end gets the read-only role. It can pull every report, reconcile against the bank feed, and tell you exactly which entries look wrong. It cannot post one, because the role it signed in with has never been able to, and no phrasing of any request changes that.
Which way the bolt goes when the power dies
“Failsafe” has a loose everyday meaning — a plan that cannot go wrong. In access control it means something exact, and the distinction is worth borrowing. Electric door locks come in two kinds. A fail-safe lock unlocks when it loses power, because the thing being protected is the people inside and they have to get out. A fail-secure lock stays locked, because the thing being protected is what is in the room.
Both are correct engineering. The question is only ever what you are protecting, and a building uses both: fail-safe on the stairwell, fail-secure on the server room. Every gateway a Busy teammate passes through is fail-secure. When a check cannot be completed, the action does not happen.
That sounds obvious and it is routinely built the other way around, usually by accident. A recipient check that is skipped when the allowlist happens to be empty reads exactly like a gate and behaves like one right up until the list is empty, which is the same day someone finishes configuring a new teammate. So the rules are stated as absolutes: an empty list permits nobody, an unreachable policy means the teammate acts on nothing, and a teammate whose stance was never configured gets the tightest one rather than the loosest.
Bolt retracts. The door opens.
Correct for fire egress: the failure protects the people. Applied to software permissions it means an outage grants access, which is how most accidental open doors get built.
Bolt stays thrown. Nothing gets through.
When the recipient list is unreachable, no message is sent. When the policy has not loaded, the teammate acts on nothing and says so. A control that has stopped working is required to look like it stopped working.
Who a teammate may talk to is one setting, not four
Reach is the highest-stakes permission a teammate has, because it is the one that leaves the building. So it is a single value from a short list of named rungs, and each rung is a fixed answer to every reach question at once: who it may write to, what happens when a stranger writes in, whether it may send outside the company, and whether it may ever start a conversation nobody asked it to start.
It could have been four independent switches, and that would have been worse. Independent switches can be set to combinations nobody would ever choose on purpose — drafting every external reply for review while cheerfully answering cold email from strangers. A ladder can only express the postures that make sense together, which means a misconfiguration has to be a deliberate act rather than an oversight.
Most teammates sit at strict-internal or chaperoned, and Roan — who works on construction projects where a stray email can direct work or start a contractual clock — is at strict-internal permanently, by contract rather than by setting.
| Rung | May reach | Stranger writes in | May initiate |
|---|---|---|---|
| solo | One person. Their principal, nobody else. | Silence | Never |
| strict-internal | People inside the organization. Outsiders are dropped from replies, not warned about. | Silence | Never |
| chaperoned-internal | An outsider may be on the thread if a principal is on it too. | Bounce | Never |
| oracled-external | Anyone on a trusted third-party list — your CRM, your Google Contacts. | Silence | Only people the oracle already knows |
| open-external | Anyone. | Answers | Anyone |
What an oracle is
Computer science borrowed the word from Delphi: an oracle is an outside source a system treats as true without checking. Your CRM is an oracle. So are your Google Contacts, your HR roster, and your vendor master.
The oracled rung means a teammate may reach anyone that list says is a real counterparty. That is often exactly what you want, and it takes the reach decision out of the model’s hands entirely.
Never let a teammate write to the list it reads from
If it can add a contact to the CRM and also email everyone in the CRM, then its reach limit is a formality: two permitted steps compose into an unpermitted one. This is the kind of hole that never shows up as a refused action, because nothing was refused.
So oracle write access and oracle-derived reach are never granted to the same teammate. Where a list must be added to, adding is an override — which is the next section.
Two-factor override: how a teammate steps up a rung
Strict rungs are only livable if there is a way through them, and everyone already knows what that looks like. It is the moment on a support call when the agent says let me get my manager to authorize that. The rule did not bend and the agent did not decide anything. Someone with the authority to approve it, approved it.
That is what a two-factor override is, and the two-factor framing is literal rather than decorative. When you log into your bank, the second factor works because it arrives somewhere other than the login screen — a different device, a different channel, out of reach of whatever is happening in the browser. A 2FO request arrives the same way: a push to your phone, or an SMS, carrying the specific action, the specific recipient, and an expiry.
The distinction that matters most is what happens after you approve. The approval is not relayed back to the teammate as a message it then acts on. The approval executes the action. The gateway that was closed opens for that one recipient, the email goes, and the teammate is told it has been sent.
This is the whole reason we say a teammate asking “may I email Dan?” in a chat window is not a control. It is a courtesy, and a convincing one, but it runs entirely inside the system being controlled: the same component decides to ask, interprets your answer, and performs the action. An override runs outside it. And critically, an approval can be scoped — this one message, this one recipient forever, or this contact added to the oracle list, which is how a teammate permanently earns a rung rather than being handed one.
The buzz
The whole message is in the notification. Approve without unlocking and it sends, or open it to read the rest first.
“Following up on the $4M ask. We’d want $200K of it as a standby note, seller-held…”
What “read first” opens
The full draft, editable, with why it needed an override and when the request expires. One tap sends it. Nothing ages in a drafts folder.
Ames is at oracled-external. Marcus is not on the list.
Subj Standby note structure
Marcus — following up on the $4M ask. We’d want $200K as a standby note, seller-held, subordinated to the SBA facility.
The teammate asks you in the chat
It decides whether to ask. It reads your reply. It performs the action. Every step runs in the component the control is supposed to constrain, which means the control is a description of intended behavior, not a mechanism.
The gateway asks you, on another device
The teammate is blocked. The request is a record on our side, the approval arrives out of band, and approval is what performs the send. Silence is a real outcome: the request expires, nothing is sent, and the teammate reports that it could not do it.
// The teammate blocks on the record, not on its own process.
const decision = await override({
kind: "review", // confirm · code · choose · review
stance: "strict-internal", // the rung it is asking to step above
title: "Send this to a first-time recipient",
to: "dan@northlake.co",
context: ["Thread started by Jeff", "Doc built 4 minutes ago"],
ttl: 3600, // expiry is an answer, not a hang
})
// { verdict: "approved", scope: "once" } → the send executes here, deterministically
// { verdict: "approved", scope: "add-to-list" } → and the contact is added to the oracle
// { verdict: "expired" } → nothing was sent; the teammate reports itThe email Vera would not send
Recently a friend emailed asking me for something, and I forwarded it to Vera to handle. She did the work well: read the thread, built the document, wrote the reply. Then she emailed it to me and only me, because he was not on her list. Which left me doing the last two steps by hand — sharing the doc, forwarding the note — and made her meaningfully less useful than an assistant who could just finish the job.
That is a real cost and it is worth being precise about it, because the obvious fix is a genuinely bad idea. Ninety-nine times out of a hundred I wanted her to send it. The temptation is to widen her reach so she can email anyone. But the failure that setting permits is not one unwanted email. It is the day an ambiguous instruction turns into outreach to every address she can find, sent from my domain, in my name. One design tolerates a small recurring annoyance; the other tolerates an unbounded one.
So there are three real answers, and the ladder is what lets us pick between them per teammate rather than once for the product.
Same problem, three postures
Model the escalation on a person and the failures stay interpretable
There is a principle underneath all of this that we apply well beyond safety: the closer a teammate’s behavior maps onto how a person in that role would actually operate, the more predictable its failures become. Not because the mechanism is human — it is software all the way down — but because you already have accurate intuitions about how colleagues fail, and none about how a novel system fails.
Escalation is the clearest case. A clear rung, a request for an override, and an expiry produce a failure you can read at a glance and act on in seconds. It is annoying. Annoying is a good ceiling for a failure mode.
It is worth saying what the alternative looks like, because the industry has landed on a bad equilibrium. Consumer assistants are increasingly trained to refuse — sometimes to the point of declining to fetch a page you wrote yourself — and the refusal arrives with no stated rule, no way to authorize it, and no way to tell a policy from a bug. We would rather set an explicit boundary and then be genuinely permissive inside it. A teammate that knows precisely what it may do has no reason to hedge about the rest.
What a Busy teammate does
What we designed against
Hard boundaries are what make wide latitude affordable
The reason to build all of this is not caution. It is that a fence you actually trust is what lets you stop supervising everything inside it. If your kid is reliably home by eight, they get the car on a Friday. If the rule was “use good judgment,” nobody can tell whether it was followed, so nobody hands over the keys.
Every control on this page exists to buy latitude somewhere else. Because the card has a hard limit, the teammate does not have to ask before every purchase. Because the books are read-only, it can work in them all day unsupervised. Because reach is enforced at the gateway rather than requested in a prompt, it can be trusted with a real inbox instead of a sandbox.
That is the trade we are making, and we think it is the one that eventually makes agents genuinely useful at work: not a more cautious model, but a better-fenced one, given considerably more to do.
the card has a limit
It buys the samples, pays the vendor invoice, and renews the subscription without asking. The worst month is bounded before it starts.
the books are read-only
It reconciles, chases coding errors and drafts the close checklist all day, with nothing in its reach that can rewrite a ledger.
the recipient list is enforced
It runs the whole thread — reading, researching, drafting, attaching — instead of stopping at every step to check whether it is allowed.
