SharedOS Cloud

Your application runs SharedOS and enforces permissions. SharedOS Cloud shows the decision events your application sends.

Design-partner preview · kernel runs in your application

The console

Every decision, in one place

try the tabs
my-agent-app
Illustrative data — not a live deployment.
SharedOS CloudYour app · your database
All calls12,427
Allowed12,012
Denied52
Escalated363

Allowed runs two orders of magnitude above the rest, so refusals sit flat against the floor until you rescale.

Decisions per hour over the last day in Production, all outcomes027655382900:0006:0012:0018:0023:00
Refusals jump from about one an hour to thirteen right after the 14:00 deploy, and settle again after 18:00. The spike and the commit are the same event.

01The ideas

Six ideas carry the whole thing

read these first

01

Messages coordinate, grants authorize.

Sending an agent a message gives it no access. Every agent works with the grants the owner issued to it, never with the sender's.

messagegrant

02

Deny by default.

No matching grant means denied. There is no admin agent, no wildcard identity, no setting to forget. Only the absence of a grant.

no_matching_grant

03

Three gates on every tool.

A tool is usable only if it is registered, its namespace is switched on for the context, and a grant covers the exact resource and action. Switching a namespace on grants nothing.

registeredenabledgranted

04

An agent can't see what it can't use.

The catalog is filtered by grant before the model sees it, and each call is authorized again from its real arguments, so rewriting a path cannot reach outside the grant.

catalog = registered ∩ enabled ∩ granted

05

One bounded turn at a time.

Each request runs one agent for one turn, with step, tool-call and time limits. What runs next, and when the product is done, is your loop's decision.

maxStepsmaxToolCallstimeoutMs

06

Denied is an answer, not an error.

A refused call comes back as a successful response with status: denied and a reason. HTTP 403 means the request never reached the kernel at all.

alloweddeniedescalated

02The layout

Where each thing lives

figure 1

Your product keeps its users, its loop and its opinions about what to do next. The owner issues grants. Your application runs the SharedOS kernel and turn envelope, checking each call locally. The model or CLI sits in the seat and never sees a grant.

SharedOS · your hostEnvelopeYour productyour orchestration loopone message → one turnAgent turncalldecisionKernelOwnerconsent → grantGrant storegrants · once per turnescalateask a humanModel / CLIprompt · replyFilesToolsAuditinvokerecord
message channelauthority channelSharedOS boundary
Authority never passes through the seat. Grants go from the owner's consent to the store and from the store to the kernel. The model only ever sees a filtered catalog and its own results.

03The grants

Design the team as a map of who may touch what

figure 2

Memory is files. Anything an agent should remember, share, or be kept away from is a path. So lay the file tree out around the permissions you want, then read the grants straight off the map: one grant per subtree per role. Private working notes are one folder per agent. Handoff is a folder another agent may read. Finance is not on anyone's row: it simply is not granted.

Three grants are not about files, and every team needs them: an execution grant so an agent may be run at all, a messaging grant per sender→recipient pair, and an escalation grant for the agents allowed to stop and ask a human.

LeadResearcherBuilderReviewerWork/atlas/brief/ · the owner writesRRRplan/WRRRresearch/RWRsrc/ · files + repo planesRWGRgreviews/RRWmemory/<agent>/ · its own onlyWWWWWork/finance/ · nobodyno grant · hidden from catalog · direct calls deniedBeyond filesmay message …the teamthe leadthe leadthe leadmay stop and ask a human
R read · W write · G git stage & commit · g git read-onlymay messagewrite authority
Every cell is one grant. Each agent also holds an execution grant on itself. Without it the turn is refused before anything runs. An empty cell is not a rule anyone wrote; it is the absence of a grant, and the tool for it never appears in that agent's catalog.

04The check

Three gates on every call

figure 3

Being able to see a tool is not permission to use it. The third gate is re-derived from the arguments the agent actually sent, so a model that rewrites the path in its own call still cannot reach outside the grant.

agent's callfiles.read(path)1 · registered?does this tool exist heretool_unavailable2 · namespace on?is the files family offeredtool_unavailable3 · grant covers it?this exact path, this action, nowno_matching_grantrunsresult: succeeded · denied · failed, never an exception
Gates 1 and 2 decide what appears in the catalog. Gate 3 is checked again on every call. The turn's own budgets (steps, calls, deadline) sit in front of all three.

05The loop

A cycle of work

figure 4

SharedOS never decides the product is done. Your loop steps the ring: run the lead, read the plan it wrote, run the workers, run the reviewer, run the lead again. One trace id per cycle keeps the audit trail grouped; a fresh execution id per attempt keeps replays honest.

Two exits. When the lead's plan says done, you stop. When an agent with the escalation grant hits something it may not do, the turn ends escalated, nothing is granted, and the request names the exact authority it wanted, so the owner can say yes with one grant and you re-run the task.

tasksfindingscommitsreviewYour productsteps each turnLead · plansResearcherBuilderReviewerdoneplan says doneOwnerescalate · nothing granted yet
Each spoke is one bounded turn. Workers run in parallel if you like; SharedOS sees them as independent turns under independent grants.

06The seat

Three ways to put an agent in the seat

figure 5

Which model or framework runs a turn is a deployment choice, never something a request can pick. All three shapes pass through the same kernel, so the grants, the gates and the audit trail are identical.

Your host runs the modelModelRuntime · POST /v1/turnsyour productSharedOSmodelloop: SharedOS · budgets, events, escalationYour own loopGET /v1/tools · POST /v1/tools/invokeyour modelyour producteach tool callkernelloop: you · no envelope, every call still decidedA coding CLI over MCPturn-scoped bridge · tools/list · tools/callCLIbridgekernelloop: the CLI · its own tools switched offCC Claude Code · Cx Codex · DS DeepSeek · π Pi · monogram badges, not official logos
owns the looprequest / call
Who steps the loop is the whole difference. Only the first shape gives you the full envelope: budgets, the event list, and the escalated outcome. The other two still re-authorize and audit every call.

07The trail

What you get back

illustrative

Every turn returns a status (succeeded, denied, failed, cancelled or escalated), the agent's output, and an ordered list of events: what the agent tried, what was allowed, what was refused and why. A turn can succeed and still contain denied calls. Count those; they are your earliest signal that a grant is too narrow or an agent is probing.

Behind the response, every decision reaches the audit trail with the actor, the authority, the exact resource and action, the purpose, the reason code, and for a refusal the list of grants that were considered and the first condition each one failed. Two hashes travel with each turn, the catalog the agent saw and the authority set it was judged against, so two runs are comparable only when both match.

atlas-launch·cycle 7·trace 8f2c…illustrative data, not a live deployment
calls this cycle148
allowed143
denied4
escalated1
09:41atlas-leadfiles.replace Work/atlas/plan/tasks.jsonallowedg-lead-plan
09:42atlas-researcherfiles.search Work/atlas/briefallowedg-res-brief
09:42atlas-researcherfiles.read Work/finance/payroll.mddeniedno_matching_grant
09:44atlas-builderrepo.commit Work/atlas/srcallowedg-build-repo
09:45atlas-builderfiles.delete Work/atlas/src/legacydeniedno_matching_grant
09:47atlas-leadsharedos.escalate “B3 needs delete on src/legacy”escalated→ owner

08The walkthrough

How it works for one product

guided tour · 4 steps

Atlas is an internal launch. Maya owns it; two agents do the work. Step through how it comes together in an application running SharedOS, then add more agents the same way.

Step 1 of 4Meet the product

One owner, two agents, one purpose.

Maya owns the Atlas files. The lead turns her brief into a plan; the researcher turns tasks into findings. Everyone is an address: grants, turns and the audit trail all name it.

human · mayaagent · atlas-leadagent · atlas-researcherpurpose · atlas-launch
owner       { "kind": "human", "userId": "maya" }
lead        { "kind": "agent", "agentId": "atlas-lead" }
researcher  { "kind": "agent", "agentId": "atlas-researcher" }

purpose     "atlas-launch"

what each one does
lead        brief → plan/tasks.md
researcher  plan  → research/<task>.md
maya        reads the result, says yes to asks

09The split

Before you start

the whole split
You operate
  • The kernel and the one-turn envelope
  • Your grant store, files, and tool providers
  • Your model or CLI and its credentials
  • Your orchestration loop and audit sink
Cloud preview shows
  • Decision events sent by your host
  • Trails behind allowed and refused calls
  • Decision trends across environments
  • Decision history beyond a log tail
Before connecting Cloud
  • Run and verify the kernel locally first
  • Discuss design-partner access with the team
  • Confirm the supported event integration
  • Keep enforcement in your application

The host owns the world. SharedOS guards the turn. Begin with Get Started. If you expose your kernel to another process, use the self-hosted HTTP guide. Your host supplies authority from its trusted store; enforcement remains local. The console demo is illustrative. Confirm the supported event integration with the preview team.