AI agents: modes, profiles, keys
Two ways to run agents, both inside the workspace: the chat built into the console, and the Claude Code, Codex and Antigravity CLIs in the image. The mode decides which tools exist; the member's profile decides which ones ask first.
| Tool class | Ask | Plan | Build | Run / Debug | Review / Test |
|---|---|---|---|---|---|
| Read and searchfiles, search, git status, logs | Auto | Auto | Auto | Auto | Auto |
| Propose a patchpropose_patch | Off | Off | Card | Off | Off |
| Run a declared checkchecks | Off | Off | Card | Card | Card |
| Write fileswrites, inside the project | Off | Off | Auto | Auto | Off |
| Run a commandexecutes | Off | Off | Card | Card | Off |
Run a command · Build · assisted. Assisted asks once per turn for anything it has not been allowed. The turn stops at an approval card; Approve resumes it.
Pick a profile, then a cell. The mode is checked first and an unknown mode gets nothing; the profile and the organisation's settings decide the rest. This is the chat only: the CLIs have their own permission prompts and are governed by where they run and what they can reach.
What it is
The chat is a bounded tool loop in the console's backend that acts on the workspace's files and shell. It speaks the Anthropic and OpenAI dialects, and Gemini through its OpenAI-compatible endpoint, with model tiers Lite, Economy and Power. The CLIs (Claude Code, Codex, Antigravity) are installed in every workspace; the platform can sign them in and hold the refresh token, and under the default guarded profile Claude Code reaches Anthropic through claude-proxy on the host, so the workspace holds only a per-workspace key that is worthless off the host.
It is
- Five modes (Ask, Plan, Build, Run / Debug, Review / Test) and three profiles (supervised, assisted, autonomous), per member.
- Approval cards that end a turn at
awaiting_approvaland resume it on Approve. - 68 pinned, read-only platform skills in every workspace, plus a per-organisation catalogue.
It is not
- A reach control. Profiles decide how much the agent asks, not what it can reach; reach is the egress and broker layer's job.
- A spend limit. There are token rate limits; there are no currency budgets, and the cost meter only measures. The organisation's AI usage tab shows use; it caps nothing.
- Able to push by default. Agent git, MCP, memory, subagents and repository skills are each off until an admin turns them on.
How it works
- Mode gate. Each mode maps to four capabilities: propose a patch, checks, writes, executes. Ask and Plan have none. Build has all four. Run / Debug has checks, writes and executes. Review / Test has checks only. An unrecognised mode resolves to nothing.
- Profile. Supervised caps the member at propose and checks. Assisted and autonomous allow all four; they differ only in the approval card. The member's own value wins over the organisation's; unset means the platform default, assisted; an operator floor can narrow everybody and widen nobody.
- Command policy. Every command is split into stages and the strictest wins: the platform floor (
sudo,systemctl,git push --force, piping a download into a shell…) is refused and no allowlist lifts it;dockeris on the floor too, except in a workspace with Docker on and “Let the AI agents run Docker commands” on, where it goes through the normal allow-or-ask rules and reaches only that workspace's own Docker broker; command substitution always asks; the organisation's allowlist and refused list decide the rest. - Card. A command or out-of-project write ends the turn
awaiting_approval. Only one command may wait per turn. Approve resumes the turn; a parked write is shown as not written; a reply that claims a card it never drew is corrected. - Keys. CLI traffic to Anthropic goes through
claude-proxy; OpenAI and Codex throughkey-brokerwhen it is on. Each workspace gets a base URL and a dummy key; the real credential is injected on the host.
Defaults
| Setting | Scope | Default | Allowed values |
|---|---|---|---|
| Autonomy and approval | |||
agent_profileHow much the agent does without asking. Member value overrides the organisation's. | platformorganisationmember | assisted (when unset) | supervised · assisted · autonomous |
agent_profile_floorOperator only. A ceiling on autonomy for everyone. | platform | unset | same three |
chat_approval_approver | platformorganisation | self | self · second-person |
chat_approval_bindingbinding refuses a run whose capabilities changed since the card was shown. | platformorganisation | advisory | advisory · binding |
command_approval_scope | platformorganisation | push-and-production | push-and-production · ladder |
agent_check_allowlistCheck names (never commands) that run without a card, for assisted and wider. | platformorganisation | empty | names, e.g. test,lint,build |
bash_allowlist · bash_denylist | platformorganisation | built-in safe list · empty | command listsNeither can lift the platform floor. |
| Switches that ship off | |||
agent_vcs_enabledAgent branch, commit, push and pull requests. | platformorganisation | off until an admin turns it on | true · false |
vcs_*_min_profilePer capability: read supervised; write, commit, branch assisted; push and PR off. Max one push per turn. | platform | see left | off · supervised · assisted · autonomous |
mcp_enabledServers come from the organisation's MCP servers list, dialled through the egress proxy. None are bundled. | platformorganisation | off until an admin turns it on | true · false |
subagents_enabled | platformorganisation | off until an admin turns it on | true · falseUp to 2 per turn, 4 steps each. |
agent_memory_enabled | platformorganisationmember | off until an admin turns it on | true · false |
agent_skills_enabledSkills from the workspace repository. | platformorganisation | off until an admin turns it on | true · false |
chat_dispatch_enabledStarting a governed agent run from chat. | platformorganisation | off until an admin turns it on | true · false |
cost_meter_enabledReports what a turn cost, and fills the cost columns of the AI usage tab. Measures only; stops nothing. | platformorganisation | off, no rates | true · false |
| Skills, content and retention | |||
catalogue_skills | platformorganisation | @developer | @developer · @assistant · * · none · names |
chat_images_enabledPNG, JPEG, GIF and WebP, sent to the organisation's Claude model with that one message; not kept in the workspace and not replayed. | platformorganisation | on | true · falseNot checked for secrets. |
chat_files_enabledPDFs and text or code files, up to 5 MB each. Text goes to the model as text, cut at 100,000 characters; a PDF goes to Claude as a document. | platformorganisation | on | true · falseA text file carrying a credential is refused. PDFs are refused while ai_mask_personal_data is on. |
ai_chat_retention_days | platformorganisation | 0 (no time limit) | 0–3650A 200-turn cap applies regardless. |
ai_agents_enabled | platformorganisation | on | true · false |
| Docker for agents | |||
| Let the AI agents run Docker commandsA workspace setting on the Docker card. Only where the workspace has Docker (managed or full); it never affects the person's own terminal. | workspace | on once Docker is on | on · offThe workspace owner or an organisation admin changes it; it applies live and every change is audited. |
| Turn budgets and rate limits | |||
ai_max_steps · ai_max_tool_callsPer-organisation caps can only lower the platform ceiling. | platformorganisation | 0 (inherit) | 0–60 · 0–200 |
chat_session_max_minutes | platformorganisation | 240 | 5–240; lower only |
claude_rate_limit_per_hour · claude_rate_limit_tokens_per_dayPer workspace, through claude-proxy. The same pair exists for key-broker. | platform | 0 (no limit) | a number |
| Credential brokers | |||
Anthropic credentialSet by the security profile, not a switch: under guarded and strict the credential stays on the host behind claude-proxy; under open and metered it is in the container. | platformorganisationrepositorymember | host proxy (guarded) | proxy · container |
key_broker_enabledThe same for OpenAI and Codex. The Antigravity CLI does not use it yet. | platform | off until an admin turns it on | true · false |
member_credentials_enabledMembers may bring their own credential. | platformorganisation | off | true · false |
Switches only open where the host allows. An organisation cannot turn on a switch the platform has off, and organisations with no value of their own inherit the platform's. To enable a switch for one organisation, turn it on for the platform and set false on the others.
Configure it
# autonomy: organisation default, operator floor
$ bin/policy set --scope tenant --target acme --key agent_profile --value supervised
$ bin/policy set --key agent_profile_floor --value assisted
# approvals
$ bin/policy set --scope tenant --target acme --key chat_approval_approver --value second-person
$ bin/policy set --scope tenant --target acme --key agent_check_allowlist --value 'test,lint'
# model keys on the host: the proxy must be running
$ bin/claude-proxy status
$ bin/claude-proxy usage --workspace acme/dev01
$ bin/policy set --key key_broker_enabled --value true
$ bin/key-broker providers
# what one tenant actually gets
$ bin/policy get-for --tenant acme --key agent_vcs_enabled
$ bin/policy tunables --group 'Agent chat'- Member profile
OrganisationsacmeMembers
A member's own profile overrides the organisation's.- Organisation
OrganisationsacmeSettings
Self-approval, Agent grants, Agent features, Catalogue skills, Audit and Chat retention cards. The AI keys tab holds the organisation's keys and sign-ins; MCP servers holds its allowlist; the AI usage tab shows use by member, workspace, surface, model and account.- Platform
ConsoleSettingsAI agents
Models behind each tier and platform sign-ins.- Developer
WorkspaceChat
The mode picker,/for the skill picker, attachments (images, PDFs and text or code files), and the turn outcome with Continue after a dropped connection.- Docker for agents
WorkspaceDocker card
“Let the AI agents run Docker commands”.
Tasks
Roll agents out cautiously
Start the organisation on supervised
$ bin/policy set --scope tenant --target acme --key agent_profile --value supervisedExpected: in Build, the chat reads and proposes patches and checks; Write files and Run a command are not offered.
Move trusted members to assisted
Set their profile under Members. Expected: they can edit files directly and each command stops at a card.
Let the project's own tests run without a card
$ bin/policy set --scope tenant --target acme --key agent_check_allowlist --value 'test'Expected: an assisted member's
testcheck runs without a card, with no network, and appears on the audit trail. Only names the project declares are eligible.Cap everybody, if you need to
$ bin/policy set --key agent_profile_floor --value assistedExpected: no organisation or member resolves to autonomous.
Keep Claude credentials off the workspace
Keep the profile at guarded or stricter, and the proxy running
$ bin/policy resolve --tenant acme --user dev@example.test --repo acme/api $ bin/claude-proxy statusUnder
guardedthe profile takes the credential out of the container. If the proxy is not accepting connections,workspace-agent createrefuses rather than leaveclaudewith neither a token nor a proxy.Sign in once, on the platform
ConsoleSettingsAI agents
Or add the organisation's own key under its AI keys tab.
bin/claude-proxy kind --tenant acmeprintsapi-key,oauthornone.Check a workspace
$ bin/claude-proxy key --tenant acme --workspace dev01 --envExpected: two lines,
ANTHROPIC_BASE_URLpointing at the host proxy and a per-workspaceANTHROPIC_API_KEYthat works only through it.
Let the agents run Docker, or stop them
Give the workspace Docker first
The agents can run Docker only in a workspace with Docker (managed or full). See Let a workspace run Docker. Once Docker is on, the setting is on by default.
Turn it off or on
The workspace owner or an organisation admin uses the switch on the workspace's Docker card, or on the host:
$ bin/workspace-agent docker-agent --tenant acme --workspace dev01 --docker-agent offExpected: the change applies to the agent's next command with no recreate, and is on the audit trail. With it on,
dockergoes through the same broker and the same refusals as the person's own, and the approval rules for commands still apply. The person's own terminal is never affected.
See what AI use costs an organisation
Open the AI usage tab
OrganisationsacmeAI usage
For organisation owners, admins and auditors. It shows requests, tokens, and total and average cost, by member, by workspace, by surface (web chat, CLI, VS Code), by provider and model, and by account: the label an admin gave a credential, who pays (organisation, platform or a member's own key). Each use is counted once. Windows are today, 7, 30 or 90 days, never longer than the audit trail.
Turn on the cost meter, if you want costs
$ bin/policy set --scope tenant --target acme --key cost_meter_enabled --value trueExpected: cost appears where a rate is set. A row with no rate shows “cost unknown”, never 0. Rows from before orxy V1.7 show “not recorded”.
Take the report
Request usage report shows the limits that apply and downloads a CSV. Each download is audited as
ai-usage-report. The platform rate limits it shows are host-wide, not per organisation, and 0 (none) unless an operator sets them.
Rate-limit one heavy workspace
Measure before you cap
$ bin/claude-proxy usage --day 2026-09-28 --jsonSet the cap from the numbers
$ bin/policy set --key claude_rate_limit_tokens_per_day --value 2000000Expected: a workspace past the line is refused with
acme/dev01 has used … tokens today, and the limit is 2000000. One request may finish above it.
Let agents open pull requests
Turn agent git on for the platform
$ bin/policy set --key agent_vcs_enabled --value true $ bin/policy set --key vcs_push_min_profile --value assisted $ bin/policy set --key vcs_pr_min_profile --value assistedWithdraw it from organisations that should not have it
$ bin/policy set --scope tenant --target acme-ops --key agent_vcs_enabled --value falseGrant the GitHub App the pull-request permission
Push goes through the git broker; the pull-requests pane needs the App to have Pull requests: read and Issues: read. See Git & provenance.
Expected: an assisted member's agent can propose one push per turn, which the developer approves; it pushes only the current branch and cannot force, delete a ref or push a tag.
Allow one MCP server
Turn MCP on
$ bin/policy set --key mcp_enabled --value trueAdd the server to the organisation's list
OrganisationsacmeMCP servers
Give it an https URL and a minimum profile. Its host must also be on the egress allowlist.
Expected: the chat offers that server's tools to members at or above its minimum profile, and nothing else.
Verify it works
In the workspacesynthetic
Good looks like: in chat, Ask never writes; a Build command stops at a card showing the exact command; Approve resumes the same turn; the audit record has the card and the decision. On the host, bin/claude-proxy usage shows the workspace's requests, and bin/policy get-for --tenant acme --key agent_profile returns what you set.
Troubleshooting
The chat does nothingAI agents are disabled for your organisation by its administrator.
Cause: ai_agents_enabled is off for the organisation (or the platform, or the member). Fix: turn it on at the level named.
Workspace create failsclaude proxy unreachable
Cause: the profile keeps the Anthropic credential on the host and the proxy is not accepting connections. Fix: start the Claude proxy service and check bin/claude-proxy status.
A provider is refusedacme has not given you access to the openai provider. An owner or admin of it can add you.
Fix: grant the member that provider under Members or AI keys.
Edits are refusedfile editing is not granted to you in this organisation. An owner or admin turns it on per member; nothing was changed.
Fix: grant file editing to the member in Agent grants.
Git tools missing`git_push` is not open to this member. Git is turned off for this organisation, or this capability's floor is above their profile.
Fix: the agent-git task. Push and PR floors default to off.
A second command is refusedone command is already awaiting approval in this turn; wait for the developer's decision.
Cause: one card per turn, by design. Fix: decide the card that is open.
A command is always refused`sudo` is refused for every organisation: … This is a platform floor and an allowlist cannot lift it.
Cause: the platform floor. Fix: none; install packages in the project, not with the system package manager.
The Docker switch is refusedDocker is off for this workspace
Cause: the workspace has no Docker. Fix: give it managed Docker first (Workspaces).
An attachment is refused
Cause: images or files are turned off for the organisation (chat_images_enabled, chat_files_enabled; the chat says so), the file is over 5 MB, a text file carries a credential, or it is a PDF while personal-data masking is on. Fix: turn the switch on, or send a smaller or cleaned file.
Requests stop mid-taskacme/dev01 has made 600 requests in the last hour, and the limit is 600
Fix: raise or clear claude_rate_limit_per_hour (0 = no limit) after reading claude-proxy usage.
Organisation cannot turn a switch onthis host has 'mcp_enabled' turned off, so an organisation cannot turn it on - …
Fix: turn it on for the platform first.
A chat-started run will not start
Open the organisation's “Why it's stuck” tab; the first gate that is not OK is the reason. See Governance.
Limits and what is not built yet
- No spend budgets in currency. The cost meter is off, has no rates, and only measures.
- AI usage. An AI usage tab for organisation admins and auditors: requests, tokens and cost by member, workspace, surface, model and account. There is no spend cap; cost shows only where the cost meter is on; AI tools that hold their own login inside a workspace are not measured.
- Attachments are not checked for secrets when they are images or PDFs: a screenshot of a secret reaches the provider as it is. Text files are cut at 100,000 characters. The audit records an attachment's name, type, size and fingerprint, never its content.
- Agents and Docker. Where the workspace has Docker and the setting is on (the default), the agents run
dockerthrough the same broker, with the same refusals, under the approval rules. Everywhere elsedockerstays on the platform floor. - The Antigravity CLI is not brokered, and some AI APIs are reachable directly. Only Anthropic is fully brokered today; the key broker is off by default.
- Under
openormeteredtokens are mounted in the container, and the per-workspace proxy key is readable by that developer. - Approval is advisory by default and self-approval is the default approver.
- Governed background runs are measured only against claude-code-acp, and their grant lapses with every new commit.
- The skill picker has open bugs; the assistant skill pack is off everywhere. No web search for agents; no Copilot or Cursor.
Related
Verified against the main branch, 4 Oct 2026.