Agent Office v0.2.3 · POC Get started
Menu: Concepts

Concepts

Capabilities

Named powers in a personnel file, compiled by the office into forge permissions, tokens, sandbox rules and harness settings.

A capability is a named, narrow power an agent can be granted, such as mail.send to specific colleagues or forge.write on specific repos through pull requests. You list capabilities in the agent's personnel file instead of writing raw allow and deny rules.

agents/ada/personnel.yaml (excerpt, example)
capabilities:
  - vault.write
  - mail.send: { to: ["*"] }
  - mail.read
  - office.read
  - forge.read: { repos: ["northwind-handbook"] }
  - forge.write: { repos: ["northwind-office"], via: pull_request }
  - hr.propose
  - approval.request
  - net.egress: ["api.anthropic.com"]
  - shell: { profile: basic }

The full list, with what each one compiles into, is in the capability catalog.

One declaration, many enforcement points#

The capability compiler is a pure function, compile(personnel, office, context), where the context names the state directory, the vault, the forge and office hosts and the other agents' homes. It produces everything a run needs:

OutputUsed forExample
Claude Code settingsRing 4, the harness: permission mode, allow and deny rules, sandbox settingspermissions.defaultMode from run.mode
Agent MCP toolsWhich office tools the agent may callmail_send only with mail.send
Forge grantsRing 2: collaborator permissions on reposforge.write → write access on the listed repos
Egress listRing 3: the sandbox's network allowlistnet.egress + the forge host + the office host (plus <ip>:<port> when the forge or office resolves to this machine, which the Linux sandbox otherwise refuses)
Token scopesRing 2: what the per-run forge token can doalways read:repository and write:issue; write:repository only with vault.write or forge.write
Plain EnglishThe desk, whoami, and the Needs-you diff"Can open PRs on northwind-office; can't merge"

Because one declaration drives all of these, the rings can't drift apart. Something allowed in the harness but missing from the token simply fails at the forge.

The fixed floor#

Some rules apply to every run, whatever its capabilities:

  • No reading or editing the office's state directory, /etc or other agents' homes, and no reads outside the working directory.
  • No sudo, su or doas. No WebSearch. No WebFetch, curl or wget unless the agent has net.egress, and then only the sandbox's network allowlist is reachable.
  • No edits to the vault's CLAUDE.md or .office/.
  • bypassPermissions and auto mode are disabled. A personnel file asking for bypassPermissions fails validation, and the compiler refuses it too.
  • The sandbox is on and fails closed: if it isn't available, the run doesn't start.
  • The office MCP is the only MCP server (--strict-mcp-config), project-level MCP servers are not loaded, and no user or project settings files are read.

A system-wide version of this floor (sandbox on and fail-closed, no bypass or auto mode, the state directory unreadable) is also installed in Claude Code's managed settings file by officectl install. Managed settings can't be overridden by a run's own settings.

Risky actions are office tools, not shell commands#

Merging into the policy repo, granting access and messaging other agents aren't things an agent does with its shell. They are office MCP tools (hr_propose_hire, hr_propose_change, mail_send, approval_request). The office checks the capability server-side before acting, and ledgers a denial (run.denied) if the check fails. For example, hr.propose lets an agent open a PR on the policy repo. Merging it is still a human's job.

Changing capabilities#

Capabilities change through a policy PR, like everything else. The Needs you page shows the compiled diff in plain English, so the approver sees "gains: open PRs on northwind-office" instead of a YAML diff. See Permissions and capabilities.

Beyond standing capabilities#

MechanismStatus
Approval. An agent with approval.request asks a human for a decision. It appears in Needs you, and a lead for that agent approves or denies it (approval.decide). Agents can't decide approvals, and nobody can decide their own request.Built
Window. A time-boxed capability, granted by approving a request. An agent asks with approval_request and kind capability.window (any capability, for example {"net.egress": ["api.example.com"]}) or budget.override, for a number of hours (default 4, at most 168). Approval opens the window (capability.window.opened), and the capability applies to the agent's runs until it expires, or until a human with approval.decide ends it early with End now on Needs you (capability.window.revoked). Windows don't add forge collaborator access.Built
Custom capabilities from pluginsRoadmap