AI Capability Containment · macOS 15+

Your agent works for you.
It should not inherit everything you can reach. Nothing crosses without permission.

Claude Code, Copilot, Cursor, Codex, Gemini CLI, MCP clients, local models — every one of them runs with your entire account behind it. BitShout is an independent, deny-by-default boundary that sits between an AI-capable process and your files, your network, your credentials and your machine — and it is not part of the AI.

4authority domains
10security laws
0third-party dependencies
Localby default

Supported-apps list? Don't need one. BitShout recognises what it is containing by code signature, Team ID and bundle identity — never by vendor name. The AI tool you install next month is covered by the same rule as the one you opened today.

Containment boundaryDeny by defaultChatGPTcom.openai.chatClaudecom.anthropic.claudeCodex CLIcom.openai.codexContained · Guard ModeYour Mac~/.ssh/id_ed25519~/.aws/credentials~/Projects/appapi.anthropic.com192.168.1.40:22
The problem

macOS has no idea your agent is an agent.

To the operating system, a coding agent is just a process you started. It gets your uid, your home directory, your keychain access, your network, your mounted volumes. The permission model was designed for software you read the source of — not for software that writes its own next step.

It runs as you

An agent launched from your account holds your account. Every key, every repository, every mounted share, every browser profile. Nothing asked it to; macOS simply handed the whole desk over.

It spawns

Deny the app and it launches a shell. Deny the shell and it invokes Python. A boundary drawn around one process is a boundary around nothing at all.

It holds your secrets

Tokens in environment variables, keys on disk, credentials in config. Handing an agent a secret makes it permanent: you cannot take back what has already been read.

The boundary, visible

Every decision, on one screen.

BitShout does not run quietly and hope. It shows you what asked, what it asked for, what was decided, and whether the decision was enforced by the operating system or only evaluated by policy — because those are not the same claim.

BitShout — AI Containment Protection on
Protected apps3All contained
Awaiting you2Approval requests
Denied today17Policy + OS
Evidence records842Local, hash-chained

Protected applications

CGChatGPTcom.openai.chatGuard Mode~/Projects/appRestricted
CLClaudecom.anthropic.claudeGuard Mode~/Projects/appRestricted
>_Codex CLIcom.openai.codexVault Mode~/Projects/appProxy only

Recent activity live

Claude requested to read ~/.ssh/id_ed25519Denied2m ago
Codex CLI requested network access to 192.168.1.40:22Denied5m ago
ChatGPT requested to write ~/Documents/notes.txtAllowed once12m ago
Claude used MCP tool github.read_repositoryBrokered18m ago
Codex CLI spawned bash → curl → api.github.comDenied21m ago
Claude requested Keychain item aws-prodDenied24m ago
Authorization

A request is not authority.

An AI application can ask for anything. Asking changes nothing. Only an active, matching, unexpired grant created by you on a trusted surface can change what the boundary does — and it is revalidated on every single use.

01AI requestsInert. Changesnothing by itself.02BitShout verifiesSigning · lineageresource identity03Human choosesOn a surface theagent cannot reach04Narrow grantOne op, one resource,one clock05RevalidatedEvery single use.Stale fails closed.Effective grantsubject=com.anthropic.claude · session=7C4A · op=readinode=dev(1,17):8814402 · expires=+00:30 · uses=1

The agent cannot answer for itself

It cannot approve its own request, forge a grant, widen its own policy, dismiss the prompt, or disable containment. The approval surface belongs to a trusted component outside the AI's reach, and the request stays pending until a human resolves it.

One field on that sheet is different from the others. Every line BitShout shows you is something it observed — the code signature, the process lineage, the resolved inode. The agent's stated reason is the only thing it merely said, so it is rendered as exactly that, and it carries no weight in the decision.

How grants are scoped
Authorization required
Claude is requesting to read a fileOutside the permitted workspace · contains credential material
High risk
Action
Read file
Path
~/.ssh/id_ed25519
Process
claude → bash → cat
Signed by
Anthropic, PBC
Why
Not provided by application
DenyBlock this request
Allow onceThis one action, then gone
Allow for sessionUntil this session ends
Allow permanently…Create a narrow rule

BitShout asked. The application cannot answer this for itself, cannot dismiss it, and cannot proceed while it is open.

Law 3 · Containment follows execution

Launching a shell is not an escape hatch.

The containment session is attached to the process tree, not to a single PID. A descendant four hops down is governed by the policy its ancestor was given, whether it is a shell, an interpreter, a package manager or a binary that replaced itself mid-flight.

claudesigned · Anthropicbashchild · /bin/bashpython3grandchild · py3curlgreat-grandchildSESSION 7C4AContained subjectStill containedconnect 192.168.1.40:22 — deniedNo matching allow rule for the inherited session→ deny. Lineage is part of the boundary, not a way around it.
Two modes

Choose how much room to give it.

Everyday work

Guard Mode

The agent runs natively on your Mac at full speed, inside a policy boundary. Filesystem, network, execution, and capabilities are each deny-by-default and each answerable to you.

  • Native performance, no virtual machine
  • One workspace granted, everything else denied
  • Policy follows every child process
  • Approvals land on a surface the agent cannot touch
Guard Mode in detail
When the blast radius matters

Vault Mode

The workload moves into a real virtual machine under Apple’s Virtualization.framework — a pinned Linux guest with no host sockets, no host processes, and one authenticated pipe back.

  • Hardware-backed isolation, not a sanitised environment
  • Guest-private tmpfs destroyed on stop
  • Credentials stay host-side, always brokered
  • Capability requests still cross the same broker
Vault Mode in detail
AI agentcontainedBitShout brokertrusted servicevalidate identityvalidate capabilityvalidate resourcevalidate parametersvalidate policyCredentialbroker-ownedGitHub APIexternalcall toolresult onlyThe reusable secret never reaches the agent.
Capability broker & MCP

Give it the capability, not the credential.

An agent that holds your GitHub token can do everything your token can do, forever, and you will not find out until it has. BitShout registers MCP servers and tools by exact identity and brokers each call: it validates who is asking, which capability, which resource, which parameters, and which policy — and only then touches the secret.

What comes back is the result of one approved operation. The reusable credential stays broker-owned. There is no generic HTTP proxy, no raw token retrieval, and no “reveal secret” call to find.

here is the key→here is the answer
Read the broker model
Fail-lock

When enforcement stops being provable, authority stops too.

Most software treats a broken security component as an inconvenience and keeps going. BitShout treats it as the thing it is. Protection configured is not protection active; a component that cannot be proven healthy does not get the benefit of the doubt.

  1. ProtectedAll boundaries proven healthy
  2. DegradedA boundary can no longer be proven
  3. LockedNew authority refused. Existing grants suspended.
  4. UnprotectedNever silently. Always stated.
  5. cannot determine → allow·cannot determine → deny
Audit & evidence

A record that says what actually happened.

Every decision lands in a local, append-only, hash-chained store: what asked, its lineage, the operation, the resource, the policy outcome, the grant that applied, and whether the operating system enforced it or BitShout merely evaluated it.

It stays on your Mac. Redaction runs before anything is written, export is an explicit action you take, and there is no mandatory telemetry to turn off.

policy denied≠OS denied
#0841policyEvaluatedsha256 ✓#0842observedsha256 ✓#0843enforcedDenysha256 ✓#0844authorizedsha256 ✓#0845enforcedAllowsha256 ✓#0846notEnforcedsha256 ✓Append-only · generation 3 · localrecord alteredChain verification fails from #0843 onward — and says so.
Security model

Ten laws that do not bend for convenience.

These are architectural invariants, not preferences. Every phase of BitShout is written against them, and a feature that would violate one does not ship in a weaker form — it does not ship.

Law 01

No ambient authority

A contained application does not inherit your authority just because you have it.

Law 02

Deny by default

Unknown or unapproved authority is denied. Nothing depends on an implicit allow.

Law 03

Containment follows execution

Process lineage is part of the boundary. Spawning is not escaping.

Law 08

Failure is not permission

BitShout never implements “cannot determine → allow”. It implements the opposite.

Law 09

Observed facts beat claims

Signing identity, lineage, resolved inode. Never the agent’s account of itself.

Law 10

Claims must be testable

No “unbreakable”. No “complete isolation”. Only what the threat model supports.

Law 10 · Claims must be testable

Where BitShout actually is.

A security product that overstates itself is worse than no security product, so here is the line, stated the same way it is stated internally.

Built and verified

  • Deterministic, non-LLM policy engine across filesystem, network, execution and capabilities
  • Process identity, code-signing identity and containment-session lineage
  • Narrow grant model with revalidation, expiry and revocation
  • Local stdio MCP brokering with broker-owned credential custody
  • Protection health, Panic Lock and tamper-evident state validation
  • Hash-chained local evidence with redaction, retention and export
  • Vault Mode isolation proven live on Apple silicon under Virtualization.framework

Not claimed yet

  • Production runtime filesystem and execution enforcement, which needs the Endpoint Security entitlement now in review with Apple
  • Remote MCP transport and OAuth brokering
  • Kernel-level fail-lock response
  • Notarized production distribution, which follows that last approval
  • Enterprise evidence collection and remote attestation

Apple has granted every entitlement BitShout needs except one: the Endpoint Security client entitlement is submitted and in review. Everything above passes its full suite on real hardware in our lab; what waits on that approval is production runtime verification, not the mechanism. The full trust page sets out exactly where the line is.

Contained by design.

BitShout is not an AI application, does not use a model to make security decisions, and does not send your work anywhere. It is a boundary. Nothing crosses it without permission.