docs blog library
github

Jazz security model

Jazz runs model-selected actions as your operating-system user. These controls reduce accidental and model-induced harm. They do not turn an untrusted model into an OS sandbox.

Start with Approvals for terminal use, Unattended runs for automation, or Surface access before exposing an agent remotely.

Tool permissions

Jazz controls tool execution, access to information, and network requests separately.

PropertyThe question it answers
RiskCan running this change something, or cause harm?
DisclosureWhat class of information can its answer carry?
EgressDoes calling it send data off this machine?

For example:

  • web_search is read-only but sends the query to your search provider.
  • write_file changes your disk without sending data over the network.
  • read_file does not change a file, but can reveal its contents.

Who is asking

A peer is another agent asking a question. A webhook is an external system firing a fixed prompt. Configure each caller’s disclosure tier, allowed tools, and budgets.

A webhook token holder is a counterparty, not the operator. The secret authenticates that webhook, never a person, and it lives in a third party’s settings screen: a GitHub repo’s webhook config, an IFTTT applet, a proxy you do not administer.

Caller runs receive no standing preferences, AGENTS.md instructions, or file attachments from paths in their prompts. They retain their budgets and tool restrictions after approval and resume. Surface access has the details.

How the ceiling is computed

A caller holds a disclosure tier and an allow list, and they do different jobs:

tool is read-only AND non-egress  →  admitted if its disclosure fits the tier
anything else                     →  admitted only if named in `allow`
TierAdmits read-only, non-egress tools whose answers are…
nonenothing at all. This is what revoking a caller sets
publicnothing about you or your machine
internal+ paths, names, what is installed. Not file contents
private+ your own material, still read-only. The most any caller gets

The following restrictions apply:

  • Raising the tier never grants an acting tool. Disclosure is silent about damage, so execute_command is not admitted at private. It is admitted by being named, at any tier.
  • An unlisted tool is absent, not unapproved. It is left out of the toolset, so the model is never offered it. Nothing outside the list for an injected payload to talk its way into, and no approval prompt for an unattended run to hang on.
  • Revocation is total. Set a caller to none and a standing allow grant does not survive it. An unrecognized tier lands in the same place, so a typo fails closed.

Where each control lives

ControlSet on
Which tools exist at allthe agent. tools adds, deniedTools subtracts last
Disclosure and allowthe caller. Each peer, each webhook
What runs without askingthe run. Approval policy, plus a per-command verdict for execute_command
What happens with nobody therethe surface. Decline, or --park and resume after a person answers

machine-readable: /docs/security.md · /llms.txt · /llms-full.txt