ROST implementation methodCompass authoring guideInstall the ROST implementation SkillROST implementation evidence and groundingAICOS chat guideResponsibility Graph playbookCharter design playbookCharter authoring deep-diveAgent staffing playbookAdd agents to your Responsibility GraphDesign a custom agentAgent builder guideAgent definition import guideHow agents workTool access and vaultAvailable tools guideCLI and MCP installation guideSkill builder guideAgent Skill authoring guideAgent Skill setup guideAgent reference mapCascade guideSignal guideFriction guideSteward queue guideBilling and pricing guideConfirmations and human gates guideGoverned command capability matrixSettings guideMembers and invites guideNotifications guideLocal runner guideStock agents guideTroubleshooting guideAI model data handling guideSecurity model guideSync rhythm playbookMigration and legal notes
Docs

CLI and MCP installation guide

Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.

company setupstaffing

On this page

  • Credential families
  • Prerequisite: a human approver in a browser
  • Placeholder legend
  • Before you start: create your account and company
  • Install the CLI
  • Headless agent login (device-code flow)
  • First-run path
  • MCP install commands
  • When to use MCP or CLI
  • Access scopes
  • Safe operating practices (security checklist)
  • CLI command catalog
  • MCP tool and resource catalog
  • Troubleshooting

Use the public CLI when a technical operator, Claude Code, Codex, Cursor, or another local agent needs to help set up and operate ROST. Use MCP when the local agent should call ROST tools directly from its own client.

The MCP server is remote and token-backed. There is no local MCP daemon to install. The CLI logs you in, mints a scoped MCP token, and prints the registration block for the deployed /mcp route.

AICOS MCP mode is deliberately seat-scoped. In Settings, the AICOS panel can create a token for the canonical AI Chief of Staff seat and then marks MCP selectable only while a non-revoked, unexpired AICOS seat token exists. Do not use a tenant-admin MCP token to staff or test AICOS; it should operate as its own governed seat, with the web panel remaining the readiness monitor and transcript surface.

MCP clients may also expose their own native browser, search, file, or shell tools. Those native client actions are outside ROST receipts, cost accounting, and audit. Treat them as ungoverned scratch work until the source is fetched or recorded through a ROST MCP tool such as web.fetch, web.search, browser.read, a work-log evidence call, or another governed command. Only the ROST tool call creates the permission receipt and evidence record.

Managed Runner turns use a generated ROST MCP configuration instead of the operator's local MCP/client config. Ordinary business-agent runner turns are MCP-only, run in a read-only sandbox, and do not receive local provider keys such as Exa or browser-provider credentials. Codex runner turns ignore user config/rules, run ephemerally, and disable native search, browser, and computer-use features; Forge developer profiles keep their separate local-code workspace behavior.

Credential families

There are two separate CLI credentials. Do not mix them: giving an implementation agent your personal session would let it act as you.

Human operator session

A human operator uses the ordinary Supabase sign-in flow. The CLI stores that session in the user slot (OS keychain or the owner-only file store with ROST_CLI_ALLOW_FILE_TOKEN_STORE=1).

npx @rosthq/cli@latest login            # browser-callback flow
npx @rosthq/cli@latest login --device   # device-code flow; a human approves in any browser

This session can run any command the operator is authorized to run. An interactive TTY still requires the operator to answer the complete Approve <command> (confirmation <id>)? [y/N] prompt before the CLI records a reviewed approval.

Implementation access (agent-led setup)

An external implementation agent does not use the operator session. Instead, the operator runs:

npx @rosthq/cli@latest implementation access start --source-client claude-code

This starts a bounded, run-bound bootstrap flow:

1. The CLI prints a workspace /auth/device URL and a short code. 2. A human owner opens the URL in a browser, matches the code, and approves the request. 3. The browser shows a distinct "Authorize an implementation attempt" disclosure: the agent receives a short-lived implementation credential, not the owner's account session. 4. The CLI receives an rost_impl_ bearer minted with a short (~55 minute) TTL and stores it in a separate CLI credential slot (implementation-bootstrap account / implementation-bootstrap.json), never in the user session slot. While the run is paused waiting on a human confirmation (setup or activation staged), each use of the bearer renews it toward an 8-hour hard ceiling, so a long human decision — a laptop sleeping mid-run — does not kill the credential.

The bearer can check progress, read orientation data, and stage human-gated drafts. It can also close its own run:

rost implementation access status    # show run/token state
rost implementation access complete  # close the run as completed
rost implementation access abandon   # close the run as abandoned

To register the same bearer with an MCP client, use:

rost implementation access install-mcp --client claude-code
rost implementation access install-mcp --client codex
rost implementation access install-mcp --client cursor

This installs the single rost_impl_ bearer directly. There is no mcp_token.create step and no second token.

Bounded bootstrap surface

The implementation bootstrap policy (implementation-bootstrap-policy) projects the explicit class map for the rost_impl_ principal. That surface is intentionally narrow:

  • Vetted reads: onboarding.status, onboarding.resume, graph.get, charter.list, charter.get, compass.get_current, goal.list, agent.list_fleet, skill.list, skill.catalog, agent_template.list, system.health, runner.status (lets the agent tell a runner-lane run's "runner offline" apart from "agent broken" while a staged agent.run_now awaits approval; every other runner.* command stays denied).
  • Human-confirmed drafts: seat.create_complete, agent.create_custom, agent.create_from_template, compass.set, compass.approve_version, onboarding.finish. Each stages a pending confirmation for a human owner to decide. seat.create_complete is the one atomic complete-Seat path described below; it does not make its optional agent live.
  • Lifecycle close: implementation_access.status, implementation_access.complete, implementation_access.abandon.
  • Outside the bounded principal: everything else stays outside this class map. The separate human-only floor also includes all four credential_flow commands (agent.configure_tools, credential.ingress, integration.connect_rest, and tenant.anthropic_key.save), the none-class decisions for escalations, onboarding path selection, task proposals, Signal readings, and error logs, confirmation.approve / confirmation.reject / confirmation.remint, confirmation.dismiss / confirmation.dismiss_stale, confirmation.activation_set.list, agent_grant_intervention.resume, and coach.draft_guide. Those commands stop before an owner-session retry in a headless invocation; an explicit interactive TTY remains the human path. The policy lives in packages/commands/src/implementation-bootstrap-policy.ts and is enforced by both the runtime guard and a CI drift test.

A bootstrap bearer is minted with a short (~55 minute) TTL and renewed while a human gate is waiting — every use of the bearer while a staged confirmation for the run is still pending extends expires_at toward an 8-hour hard ceiling (least(created_at + 8h, now + 2h), never past the ceiling and never backwards), so a run does not die during a long human decision. Renewal is bounded and conditional: it fires ONLY while a gate is pending, so an idle or unattended credential keeps the short default and the ceiling caps the total lifetime no matter how many renewals occur. rost implementation access status reports the remaining life (expires_in_seconds) and whether the run is gate_waiting. Once the bearer fully lapses (no gate was waiting, or the 8-hour ceiling was reached), there is no resume or refresh: the ONLY recovery is a brand-new implementation access start, which mints an entirely new, unrelated run. implementation_access.complete/.abandon's run_id is always the run THAT call closed — the one bound to the credential presented on that specific request — never a stand-in for an earlier run in the same overall onboarding session. If a credential expiry (for example, a host going to sleep mid-run) forced a fresh start partway through, the run that performed the earlier setup/rehearsal/activation steps is a DIFFERENT id from the one complete reports. Both close responses also carry reconciled_stale_run_ids: the ids of any OTHER runs for the same tenant whose bearer had already lapsed, reconciled to expired as a side effect of this close. It is normally empty; it is populated whenever this tenant has a run like that sitting around — most often the predecessor from a mid-session restart, but equally an earlier implementation-bootstrap attempt that was simply never explicitly closed.

Read that field against already_closed, which is returned alongside it. An empty reconciled_stale_run_ids means "swept, nothing was stale" only when already_closed is false. When already_closed is true the call was an idempotent no-op — it closed nothing, so it reconciled nothing, and the empty array means "did not look" rather than "this tenant has no stale runs". Reconciliation is also a side effect of closing, not a scheduled sweep: a tenant that never closes a run, and a run that was opened by a device approval that was never polled (so no bearer was ever minted), are both outside what this reconciles. #### How the CLI reaches that surface

With an implementation credential present, the CLI runs every classified command over that credential — on the generic rost command <id> --json '<body>' path and on the ergonomic verbs that resolve to a classified command: rost graph show, rost seat list, rost agent list-fleet, rost agent templates, rost goal list, rost system health, rost skills list, rost skills catalog, rost charter list, and rost charter get. Every other vetted read in the class map — including the ones with no ergonomic verb — is reachable as rost command <id> --json '<body>', and this precedence remains true when a user session coexists.

A command outside the class map is never emitted through the implementation client. A human-decision command in that family stops before an owner retry in a headless session; an explicit interactive TTY remains the existing human signal for the owner path. An expired, unreadable, unauthenticated, or refused implementation credential is terminal for the invocation and is never silently replayed as the owner. When implementation_access.complete or .abandon succeeds, the CLI clears the bearer and writes a local closed-run tombstone (implementation-bootstrap-closed.json, no secrets) so a later headless process can tell a completed or abandoned run apart from an owner who never started one; bootstrap-classified commands then refuse owner fallthrough until a new implementation access start.

Precedence. A usable implementation credential wins for every classified command, including general verbs and the composite onboarding wrappers, because the run is the bounded acting principal. It also decides the commands it is NOT entitled to run: while a run is live, a headless invocation of a deny-class command is refused outright, naming the command and the missing implementation route, instead of quietly executing under a co-resident owner session (DER-3255). The bounded credential is never sent for such a command either — both principals stop. An explicit interactive terminal is still the owner's deliberate path for those commands, and an absent credential leaves the owner-session path available unless a closed-run tombstone is present, in which case headless bootstrap-classified commands refuse instead of falling through to a co-resident owner session. Expiry, local-store errors, authentication failures, and policy refusals stop the invocation instead of falling through to the owner.

Some verbs that look like reads are not. A Markdown-rendering show verb resolves to a *.show_markdown command the policy denies, even though the same underlying data is inside the surface — read those through the vetted list/get verbs named in the allowlist above instead. Likewise rost agent fleet-digest (agent.fleet_digest) is denied; the vetted fleet read is rost agent list-fleet.

Staging behaves the same over either credential: a stage-class command exits 0 and prints the pending confirmation id and approval URL. The bootstrap principal never follows that with confirmation.approve — including under --yes — because a human decides (confirmation.approve is denied to it).

Full Operator device exchange

A Full Operator installation (a specific Codex, Claude Code, or comparable device identity) is a fourth ROST principal — distinct from a human operator session, a seat-scoped MCP token, and the implementation-bootstrap principal above. It never signs in as a person and is never coerced into a user session or an agent seat occupancy. It acts under a standing authorization a human owner deliberately established, and every action it takes is attributed to *the operator*, authorized by that human — never to the human directly.

> Current availability — no Full Operator session can be issued in the deployed Google-only sign-in configuration. Issuance requires a provider-backed, recent credential-authentication proof. The approval gate accepts only recent password, otp, or totp AMR evidence; the configured Google OAuth flow cannot provide that proof, and /auth/operator-reauth intentionally stops instead of treating account selection or a new OAuth callback as reauthentication. Do not start or poll this exchange expecting a session today. Use the ordinary human or implementation-bootstrap flows as appropriate. The protocol below becomes available only after a provider-backed fresh-authentication contract is configured.

When that prerequisite is available, the exchange uses two separate possession checks: an installation key binds the resulting session to the machine that started it, and a one-time poll secret keeps a copied device code from making the server perform unbounded signature work or consuming the legitimate installation's shared poll interval. Neither is a reusable user credential.

1. The operator client generates an ed25519 keypair for the installation and starts the exchange with purpose: "operator_grant", its own source_client label, and an installation_fingerprint_hash — the sha256 hex digest of the raw 32-byte public key (never the private key or any secret material — the CLI's secrets-never-travel rule above applies here too). The start response returns a challenge_nonce and a one-time operator_poll_secret. The client retains both; the service persists only their safe correlation values (the nonce and a SHA-256 hash of the poll secret), never the plaintext secret. 2. A human owner opens the printed /auth/device URL, matches the code, and approves. The browser shows a distinct "Authorize an operator" disclosure naming the requesting client and the company, and states plainly that this is an external operator installation, not a ROST agent. 3. The client polls with purpose: "operator_grant", its device_code, the exact lowercase-hex installation_fingerprint_hash sent at start, and the one-time operator_poll_secret, plus a possession proof: installation_public_key (the raw ed25519 public key, base64url, no padding) and challenge_signature (an ed25519 signature over the exact ASCII bytes of the challenge_nonce string from step 1, base64url-encoded, no padding, 64 raw signature bytes). All five values are required. The service requires both opaque-code hashes in its lookup before it locks a device row, decodes a key, verifies Ed25519, or writes a proof-work limiter hit. It then independently re-derives the fingerprint hash from the presented public key and rejects the poll unless it matches the value captured at start — presenting either a fingerprint hash or poll secret alone is not authentication; a valid signature over the exact nonce is still required. Proof work is durably limited by trusted caller partition and poll-secret hash, with a global cap; it never advances the device row's shared last_polled_at on a bad proof. Only the first successful poll mints a session bearer — prefix rost_operator_, a 15-minute TTL — and returns it exactly once. A copied code without its matching poll secret, a mismatched fingerprint, or a missing/invalid proof gets nothing without consuming the legitimate exchange.

When provider-backed issuance becomes available, there is still no revocation surface for an established Full Operator authorization — no route, command, or Settings action calls it. The tenant issuance setting and the operator issuance kill switch block future approvals and future session issuance; the poll re-validates the authorization and the installation as still active, inside the same transaction that mints the session, so a status change or a kill-switch flip that lands before the first poll blocks issuance rather than racing it. Neither can invalidate a session that has already been minted; that session runs out its own 15-minute TTL.

The protocol's permitted scope is deliberately minimal once issuance is available. Under ADR-0025, every command carries exactly one Full Operator classification, and an operator session may only call a command classified operator:

  • Confirmation-free reads and status commands.
  • Two input-predicated goal.* boundary commands: goal.bind_measurable (only an informs-only bind — any role other than absent or "informs" falls to a human) and goal.set_auto_status (only enabled: false — turning Signal-driven auto-status on falls to a human).

Everything else is denied, including any command the classification map has no explicit entry for — an unclassified or newly-added command defaults to blocked, never to operator authority by omission.

No mode, lane, or standing authorization — including a future, broader one — can let an operator, under any authorization:

  • Handle or reveal raw secrets or credentials
  • Mint a credential or token
  • Act across tenants
  • Capture or change owner or member access
  • Destroy tenant or audit data
  • Spend money
  • Approve its own actions
  • Expand its own authority

Operator eligibility is expected to grow beyond this minimal reads-plus-two-boundary-commands set, but only through a separate, security-reviewed, founder-approved-per-batch expansion (tracked as DER-2205) — U3 ships the minimal floor deliberately, not as a permanent ceiling.

Prerequisite: a human approver in a browser

A headless agent cannot complete setup unattended. Two things always require a human, so plan to announce the handoff rather than stall silently:

  • Device-code approval at first login. rost login --device prints a code; a human must open the workspace URL in a browser, sign in with Google, match the code, and approve.
  • Durable gated commands. Setting or approving a Charter, staffing a seat, taking an agent live, and minting or revoking an MCP token each require a human approval boundary (an agent never approves its own request — see the confirmations-guide). In a headless/agent session, or over MCP, the command surfaces the confirmation_id and an approveVia URL for a human and stops. When a logged-in human runs rost command <id> or rost mcp install from an interactive TTY, the official CLI renders the complete gate and asks Approve <command-id> (confirmation <id>)? [y/N]; only an explicit y or yes calls confirmation.approve with reviewed: true and prints the approved command output. TTY presence alone is never approval, and there is no headless token-mint bypass. See the confirmations-guide for which pauses an agent-led onboarding run hits under this bounded bootstrap surface, and the rule that produces them.

Treat these as blocking prerequisites: the agent prepares the request and waits for the human approver.

  • Secrets never travel through the CLI. Raw-secret sinks (credential.ingress, tenant.anthropic_key.save) are refused on every CLI path — an ergonomic verb, --input, and rost command <id> --json all stop with guidance instead of accepting the secret, because a value in argv lands in shell history and process arguments before any redaction. Provide the secret through the vault-backed flow (web Settings or the integration connect flow); the CLI only ever carries the non-secret credential *name*, scope, and provider. Disabling tenant BYOK (tenant.anthropic_key.disable) never returns the old key; it revokes the active vault-backed credential only after managed Anthropic fallback is available.

Placeholder legend

Commands below use angle-bracket placeholders. The CLI prints the real, fully-resolved values at runtime — read them from the terminal, do not hand-construct them:

  • <your-workspace-url> — your workspace origin. The CLI prints the full /auth/device and /mcp URLs in its output; copy them from the terminal rather than guessing the host.
  • <tenant-slug-or-id> — a tenant identifier from rost tenants.
  • <seat-id> — a seat id from rost command seat.create output or rost_get_responsibility_graph / rost command graph.get.
  • <token-id> — an MCP token id printed by mcp install, or discoverable later via rost command mcp_token.list / rost_list_mcp_tokens.
  • <confirmation-id> — shown in the CLI error or output for a gated command; see the confirmations-guide.

Before you start: create your account and company

A ROST account (the human identity) is created with Google sign-in — in the browser at /signup, or headlessly via rost login --device (a human approves the code in any browser). A company (tenant) can then be created either way:

  • Browser: at /signup, name your company, then return to the CLI.
  • Headless first company (no browser step): once logged in, run rost signup --company "<name>". If the account has no active company yet, this provisions the first company for your session and makes it active, so rost onboard status and every other tenant-scoped command work immediately. This is the recommended path for an autonomous agent setting up from scratch.
  • Additional entitled company: from an existing active company session, run rost tenant create --company "<name>" [--json]. This creates a clean additional company only when the account has an active tenant.create.additional entitlement. A denied attempt returns a clean refusal and creates no tenant row.

If you run a tenant-scoped command before any company exists, the CLI tells you both first-company options. rost signup --company is not a second-company creation command: running it again returns the active company, names the company you requested, and says that no new company was created. The default output is human-readable; add --json only when an automation needs the raw command output. To inspect or switch among companies you can already access, use rost tenants and rost use <tenant-slug-or-id>.

Install the CLI

Run the published package with npx:

npx @rosthq/cli@latest --help
npx @rosthq/cli@latest login

Or install it globally:

npm i -g @rosthq/cli
rost login

The package requires Node 22 or newer. The binary name is rost. Check your version before installing — npx will still launch the package on Node 20 or 18, but the CLI rejects an older runtime:

node --version

If it prints anything below v22, upgrade Node first.

Headless agent login (device-code flow)

A coding agent (Codex, Claude Code, or any headless shell) signs in without a browser of its own: the agent prints a short code, and a human approves it in any browser. This is the recommended path for autonomous agents. Plain rost login (the browser-callback flow) stays the default for an interactive human at a keyboard.

rost login --device

How it works:

1. The CLI prints a verification URL (your workspace's /auth/device page) and a short code, then polls and waits:

   To sign in, open this URL in any browser and approve the code:
     https://<your-workspace-url>/auth/device

     Code: ABCD-EFGH

   Code also available via 'rost auth device status' if this terminal loses it.

   Waiting for approval…

The <your-workspace-url> shown here is a placeholder for this doc; the CLI prints your actual workspace origin. Read the URL and code from the terminal — do not hand-construct them. If a buffered or piped terminal (an agent's own | tail -40, a log capture that only flushes on exit) loses that one print, run rost auth device status from a second terminal or process on the SAME machine to reprint the URL, code, and remaining time — see "Recovering a lost code" below. 2. A human opens the URL, signs in with Google, confirms the code shown in the browser matches the one in the agent's terminal, and clicks Approve. 3. The CLI detects the approval, exchanges a one-time handoff for a session, and stores it in the OS keychain. rost whoami then shows the account, and tenant-scoped commands (rost onboard status, etc.) operate in the approver's active tenant. If the approver has no company yet, create one headlessly with rost signup --company "<name>" — no browser step.

Notes:

  • The code expires after 10 minutes — rerun rost login --device if it lapses.
  • No password is entered, and no access token is stored on the server; only the agent's own machine holds the session (in its OS keychain).
  • Matching the code before approving is a security step: only approve a code your own agent printed.
  • Approve only in a browser you control and trust — never on a kiosk or someone else's device, and sign out afterward on any shared machine. Approval grants a live ROST session tied to your Google identity, not just a code match.

Recovering a lost code

rost login --device also persists the pending exchange locally the moment it is minted — preferring the same OS keychain the finished session uses, and falling back to an owner-only file (directory 0700, file 0600) under the CLI state dir with no opt-in flag needed, since this record is not itself a bearer credential (see "Headless Linux, CI, and machines with no keychain" above for the parallel session-store behavior). If the one mint-time print above is lost, run this from a second terminal or process on the SAME machine:

rost auth device status

It reprints the verification URL, the user code, and the time remaining before the exchange expires — no network call, so it works even mid-poll. Once the exchange completes (approved), is denied, or expires, the local record is purged; rost auth device status then reports there is no pending sign-in and points back to rost login --device.

Owner pre-authorization (Pair an agent)

An owner can pre-authorize a headless agent's login instead of matching a browser code after the fact. In the app, open onboarding's Pair an agent panel and choose Start pairing — it mints a one-time pairing code (rost_pair_…, shown once, valid 15 minutes) scoped to your workspace. Hand that code to the agent and have it sign in with:

rost login --device --pairing-code <code>

The device start then anchors to your workspace. When the agent connects, its request appears in the Pending pairings list as ready to approve, and you approve it in one click — no browser user_code to read back and match. The approved session logs the agent in as you (same session shape as the typed-code flow above), so nothing about the agent's authority differs from an ordinary login --device. A pairing you did not start never appears in your list, and the plaintext code is never re-shown or returned by any read.

To see the same live pairing state over CLI/MCP, use device.pairing.list (MCP tool rost_list_pending_device_pairings) — it lists this tenant's pending pairing intents (code minted / awaiting approval) with each connected device request and whether it is one-click-approvable. It is owner/admin only and never returns the pairing code. Omitting --pairing-code keeps the ordinary unanchored flow: the agent prints a user_code and a human approves it by matching that code in a browser.

Headless Linux, CI, and machines with no keychain

By default the CLI stores the session in the macOS Keychain (on darwin). There is no built-in Windows or Linux keychain integration today — on any non-macOS host, or any machine without a keychain, the CLI errors with "No OS credential store is available" unless you opt into the file store.

On macOS, the CLI now verifies the keychain write is readable back right after login. On some headless/service hosts the keychain accepts the write but a later command's process cannot read it back (an ACL scoped to the writing binary, a re-locked login keychain, or a launchd/SSH session with no keychain), so login reports success yet the next command prints "Not logged in". When that readback fails, the CLI automatically writes the session to the same owner-only file store (directory 0700, file 0600), prints a one-line stderr notice, and later commands read it back transparently — so a headless macOS agent "just works" with no flag. For a fully unattended macOS host, export ROST_CLI_ALLOW_FILE_TOKEN_STORE=1 anyway so every command uses the file store directly.

The keychain write itself is also bounded so it can never hang login --device after a successful approval: it runs through the keychain tool's own batch command interpreter with the session supplied inline (never on the command line, so it still never appears in ps) and a fixed timeout. If that write times out or otherwise fails, the CLI kills it and automatically falls over to the same owner-only file store — again, no flag and no manual retry needed.

For headless Linux, CI runners, or any no-keychain environment, set ROST_CLI_ALLOW_FILE_TOKEN_STORE=1 to opt into the development-only plain-file token store. It is not encrypted — it writes the file with owner-only permissions (directory 0700, file 0600) and prints a stderr warning. It stores only CLI session tokens (access + refresh token), never tenant secrets, API keys, or vault refs. Treat that file as a credential: do not bake it into a shared image and do not commit it.

The CLI checks this flag on every invocation, not just login. Export it for the whole shell or CI job (so rost whoami, rost onboard status, and the rest also find the file store), not only on the login line:

export ROST_CLI_ALLOW_FILE_TOKEN_STORE=1
rost login --device

For CI, do not run an interactive device login on every job (a device code still needs a human approver, which CI does not have). The CLI stores the Supabase refresh token from login / login --device and refreshes the access token before command execution when it is close to expiry, so normal local agent sessions survive the short access-token window without repeated browser approvals. The refresh token is still a user credential; if refresh fails or is revoked, run rost login --device again. For ongoing unattended automation, prefer a seat-scoped MCP token used directly by your MCP client, and treat that client config as a secret. Such a token now defaults to a 90-day expiry, so for automation that must outlive that window, mint it with an explicit --expires-in <days> (up to 365) or, accepting the long-lived-credential tradeoff, --no-expiry — e.g. mcp install --scope seat --seat-id <id> --expires-in 365. Rotate it before it lapses (--rotate <old-token-id>), and revoke and re-mint if a runner image is rebuilt or shared.

First-run path

This is the install/auth quickstart — it gets you logged in, MCP registered, and onboarding started. It is a convenience view, not the full org-setup procedure: for the canonical end-to-end setup order beyond install, agent-reference-map is the source of truth. Read it with rost reference get agent-reference-map (step 6 below).

1. Log in: npx @rosthq/cli@latest login (or rost login --device for a headless agent) 2. Confirm identity: rost whoami 3. Create your company if you have none yet: rost signup --company "<name>" (no browser step) 4. List tenants: rost tenants 5. Select a tenant when needed: rost use <tenant-slug-or-id> 6. For an entitled additional clean company, create it from an active company session: rost tenant create --company "<name>" 7. Read the agent map: rost reference get agent-reference-map (the full canonical setup order lives here) 8. Register MCP for the client (pick a scope — --scope is required): rost mcp install --client claude-code --scope tenant-admin for setup, or --scope seat --seat-id <id> for a narrower seat token 9. Inspect onboarding: rost onboard status 10. Get the guided agent prompt: rost onboard run

Or use the one-shot helper: rost init logs in when needed, optionally selects a tenant, installs MCP, and prints the onboarding prompt. It does not run every numbered step above (it does not create your company or call onboard status) — it gets you logged in, registered, and handed the onboarding prompt. As the first-run helper it defaults to a tenant-admin token (no seats exist yet), so unlike a direct mcp install it does not need --scope; pass --scope seat --seat-id <id> if you already have a seat to scope it to:

rost init --tenant <tenant-slug-or-id> --client codex

MCP install commands

A direct mcp install now requires an explicit `--scope` — there is no silent default. Choose --scope seat --seat-id <id> (the narrowest scope, limited to one seat's Charter and permission manifest — prefer it for day-to-day operation) or --scope tenant-admin (can administer the whole company — reserve it for initial setup). Running mcp install without --scope errors and mints nothing, naming both options. (The first-run helper rost init is the exception: it defaults to --scope tenant-admin because no seats exist yet at setup; and --rotate inherits the old token's scope, so it does not need --scope either.)

mcp install never self-approves token mint or revoke confirmations. A human at an interactive terminal can review the rendered gate and answer yes; a headless session surfaces the pending confirmation and stops.

Claude Code (tenant-admin):

npx @rosthq/cli@latest mcp install --client claude-code --scope tenant-admin

Codex (tenant-admin):

npx @rosthq/cli@latest mcp install --client codex --scope tenant-admin

Cursor (tenant-admin):

npx @rosthq/cli@latest mcp install --client cursor --scope tenant-admin

The tenant-admin token administers the whole company. For day-to-day operation, prefer a seat-scoped token instead — it operates only as one seat and is limited by that seat's Charter and permission manifest. Reserve the tenant-admin token for initial setup.

Seat-scoped MCP for a specific seat:

npx @rosthq/cli@latest mcp install --client codex --scope seat --seat-id <seat-id>

The <seat-id> comes from rost command seat.create output or rost_get_responsibility_graph / rost command graph.get.

Approving the token mint

Minting a token (and the inline revoke that --rotate performs) is a human-gated authority change at the command layer. How rost mcp install handles that approval depends on whether it runs in an interactive session:

  • Interactive operator (a human at a real terminal). The CLI renders the complete gate, then asks Approve mcp_token.create (confirmation <id>)? [y/N]. Only an explicit y or yes records reviewed: true, completes the mint, and prints the registration block. TTY presence alone is never treated as review; silence or decline mints no token.
  • Non-interactive / headless / agent session. The CLI does not approve its own request. It surfaces the confirmation and stops, minting nothing: it prints the confirmation_id, the exact rost command confirmation.approve --json '{"confirmation_id":"<id>"}' command, and the approveVia URL when the server provided one, then exits non-zero ("pending human approval"). A human then approves it (in a browser or with that approve command) — and that approval executes the mint and returns the token in the approve output (shown once), so register it with your client from there. Do not re-run mcp install after approving: that starts a second mint and orphans the first token. The retired --skip-permissions flag is rejected, and ROST_CLI_SKIP_PERMISSIONS is ignored; neither can replace human review.

The broader rule still holds for durable changes an agent proposes — charters, decisions, compass and charter amendments — where an agent never approves its own request and a human approves the surfaced approveVia confirmation. See the confirmations-guide for the four confirmation levels and that flow.

Handling the printed token (read this before you paste anything)

The registration block mcp install prints embeds a live bearer token — a real, scoped credential. mcp install prints this block; it does not write any client config itself. You apply it, and once applied the token lands in the client's config file in plaintext:

  • Claude Code: run the printed claude mcp add command — that command writes the token into Claude Code's MCP config.
  • Codex: paste the printed TOML stanza into your Codex config file.
  • Cursor: paste the printed JSON entry into Cursor's MCP config.

Because the token lands on disk in plaintext, treat it like a password:

  • Never commit the block or the client config to version control, and never paste it into a chat, issue, or log. A leaked block grants its full scope until revoked.
  • The session asymmetry matters: your CLI login session lives in the OS keychain and is cleared by rost logout. The MCP token is a separate credential written in plaintext into the client config — rost logout does not revoke it. Revoke MCP tokens separately (below).

Example shapes of what mcp install prints (token redacted as <MCP_TOKEN>; the real values, including the workspace URL, are printed by the CLI — do not hand-construct them):

# Claude Code
claude mcp add --transport http rost https://<your-workspace-url>/mcp --header "Authorization: Bearer <MCP_TOKEN>"
# Codex (config.toml)
[mcp_servers.rost]
url = "https://<your-workspace-url>/mcp"
transport = "http"
headers = { Authorization = "Bearer <MCP_TOKEN>" }
// Cursor (mcp.json)
{
  "mcpServers": {
    "rost": {
      "url": "https://<your-workspace-url>/mcp",
      "headers": { "Authorization": "Bearer <MCP_TOKEN>" }
    }
  }
}

Verify the MCP connection

After registering, confirm the client can actually reach the server with the new token before doing real work. Make one cheap read call scoped to your token type:

  • Any valid token: call rost_list_commands with {}.
  • Tenant-admin token: read the resource rost://tenant/status.
  • Seat-scoped token: call rost_get_context with {} (or read rost://seat/<seat-id>/context). A seat token cannot read rost://tenant/status — that is tenant-admin only, so do not use it to test a seat token.
  • Success returns a normal JSON payload (the command list, your tenant/onboarding status, or your seat context). An auth error (a 401 / "not authorized" shape) means the token did not register — re-run mcp install.

Token lifetime and rotation

Every MCP token now carries an expiry. Tokens minted by rost mcp install default to a 90-day TTL (for both tenant-admin and seat-scoped tokens); after that the token stops authenticating and you re-mint. Override the lifetime at mint time:

  • --expires-in <days> — set an explicit TTL, between 1 and 365 days. Example: rost mcp install --client codex --scope tenant-admin --expires-in 30.
  • --no-expiry — mint a token with no practical expiry (a ~100-year TTL). This is a deliberate loosening for long-lived automation; the CLI prints a warning. Prefer a finite --expires-in and rotate instead.

mcp install echoes the chosen expiry, and rost command mcp_token.list reports expires_in_days for every token so you can see what is about to lapse.

One-step rotation. Replace a live token in a single command — it mints the replacement, prints the new registration block, then revokes the old token:

rost mcp install --client <client> --rotate <old-token-id>

Rotation preserves the original token's scope and seat: rotating a seat-scoped token mints a new seat-scoped token for the same seat, and rotating a tenant-admin token mints a tenant-admin token — you do not pass --scope/--seat-id (and if you do, they must match the old token, or the command errors without minting). The CLI looks the old token up first, so an unknown --rotate id fails cleanly with nothing minted. In an interactive session, mint and revoke are separate gates: after approving the mint, the CLI renders the complete revoke gate and asks Approve mcp_token.revoke (confirmation <id>)? [y/N]. Only an explicit y or yes sends reviewed: true and revokes the old token. If the operator declines, or if revoking the old token fails (or the id isn't found at revoke time), the new token is already live but the old token remains live too; the CLI prints the replacement credential exactly once so it can be recovered, labels the rotation incomplete on stdout, explains the partial state on stderr without repeating the secret, prints the manual mcp_token.revoke command, and exits non-zero. Find the <old-token-id> with rost command mcp_token.list.

You can also rotate the long way (mint then revoke separately):

1. Re-run rost mcp install --client <client> --scope <tenant-admin|seat> (add --seat-id <seat-id> for a seat token) to mint and register a fresh token — a direct install requires --scope. 2. Revoke the old one (below). Rotate on a periodic cadence, and whenever the scope or seat changes.

Revoke a token

Revoke the server-side token with the command printed by mcp install:

rost command mcp_token.revoke --json '{"token_id":"<token-id>"}'

Revocation is not just end-of-session housekeeping — it is your incident-response action. Revoke immediately if a laptop is lost or stolen, the client config leaks, or the token is committed to version control. If you no longer have the original printout, find the <token-id> with rost command mcp_token.list (MCP rost_list_mcp_tokens) — it returns token metadata, never token material.

Uninstall and cleanup

Revoking the server-side token leaves a dead entry in the client config that will keep erroring. To fully tear a setup down:

1. Revoke the token (mcp_token.revoke, above). 2. Remove the ROST entry from the client config: claude mcp remove rost for Claude Code; delete the [mcp_servers.rost] stanza from the Codex TOML; delete the rost entry from Cursor's mcp.json. 3. rost logout to clear the CLI session from the keychain (this does not revoke MCP tokens — step 1 does that).

Blast radius of a tenant-admin token

A leaked tenant-admin token can administer the whole tenant, not just one seat. It can run tenant-wide setup and onboarding, staffing (rost_staff_seat), member add / remove / role-change (rost_remove_member), Charter approval (rost_approve_charter), settings changes, and further token minting (rost_create_mcp_token) across every seat in the tenant. A seat-scoped token can act only as its one seat, bounded by that seat's Charter and permission manifest. This is why a direct mcp install now requires you to choose `--scope` explicitly (no silent tenant-admin default), why you should mint the narrowest scope that does the job, and why you should reserve tenant-admin for initial setup. mcp install echoes the granted scope and its blast radius at mint time on every path. See the security-model-guide for tenant isolation, vault-backed credentials, and the seat-scoped-authority principle.

Storing the Anthropic key and other credentials

Storing the tenant model key or any other secret goes through credential ingress as a vault reference — the secret is never pasted into a prompt, config, or log. Use rost_save_tenant_anthropic_key (tenant.anthropic_key.save) for the tenant Anthropic key; other secrets go through the Settings vault-ingress flow (credential.ingress), a human-only interactive flow that is deliberately not an agent-callable MCP tool and refuses raw secrets over CLI argv. Disabling the tenant Anthropic key uses tenant.anthropic_key.disable: it is owner/admin-only, always human-gated, revokes the active credential row without reading or returning secret material, and first checks that managed Anthropic fallback is configured. rost_configure_agent_tools stages credential *requests* (provider, scope, and label only) but never accepts raw secrets. Credential storage is a gated credential_flow confirmation that a human approves. For the vault model and the security posture behind this, see the security-model-guide and the tool-access-and-vault guide; for model-bound data, BYOK provider handling, and local-client provider settings, see the ai-model-data-handling-guide; for the confirmation gate, see the confirmations-guide.

When to use MCP or CLI

  • A technical operator wants to drive onboarding from a local agent session.
  • A partner wants to use their own local model subscription. Read the ai-model-data-handling-guide first so the operator can verify the local provider account, retention, telemetry, and transcript settings instead of assuming ROST controls them.
  • A Steward wants a local agent to inspect context, draft changes, or prepare work.
  • A developer wants repeatable setup commands.

Access scopes

Tenant-admin access can help set up the company. Seat-scoped access lets an agent act only as a specific seat. Prefer the narrowest scope that can do the job — a direct mcp install requires you to choose --scope tenant-admin or --scope seat --seat-id <id> and mints nothing until you do. rost init defaults to tenant-admin (first-run setup, no seats yet), and --rotate inherits the existing token's scope. See the security-model-guide for tenant isolation, vault-backed credentials, server-side authority checks, and the seat-scoped-authority principle.

For pairing and running a local runner, see the runner-guide.

Safe operating practices (security checklist)

These are the security posture rules for operating after install — a checklist applied across the whole setup, not a competing install procedure. For the full rationale, see the security-model-guide.

1. Log in with the CLI and select the tenant if needed. 2. Read agent-reference-map. 3. Register MCP for the narrowest needed scope (prefer a seat-scoped token for day-to-day operation). 4. Start with onboarding.status or context lookup. 5. Draft changes before durable activation. 6. Route approvals through human confirmation (an agent never approves its own request — see the confirmations-guide). 7. Revoke tokens when you finish operating or the seat changes — and immediately on a lost laptop, leaked config, or committed token. (Revoking is separate from rost logout, which clears only the CLI session, not MCP tokens.)

CLI command catalog

Authentication and tenant selection

CommandPurposeScopeSafe example
rost loginOpen browser login and store the CLI session.User sessionrost login
rost login --deviceDevice-code login for a headless agent: prints a short code + URL, a human approves in any browser, the CLI polls until authorized — no browser session needed on the agent's machine.User sessionrost login --device
rost auth device status [--json]Reprint this machine's own pending device-code exchange (verification URL, user code, expires-in, poll state) if the one mint-time print was lost to a buffered or piped terminal. Reports expired (and clears the local record) once the exchange's own TTL has passed.Local (reads only this machine's pending-exchange store)rost auth device status
rost logoutClear the local CLI session.Local sessionrost logout
rost signup [--company "<name>"] [--json]With no flag, open/print the web signup page. With --company, bootstrap the first company headlessly for the logged-in session. If one is already active, it returns that company and says no new company was created. Add --json for machine-readable output.Public (--company needs a login session)rost signup --company "Acme"
rost tenant create --company "<name>" [--json]Create an additional clean company from an existing active company session. Requires tenant.create.additional; denied attempts create no tenant. Add --json for machine-readable output.Logged-in tenant owner with entitlementrost tenant create --company "Acme East"
rost whoamiShow the authenticated user, accessible tenant roles, and the active tenant (current_tenant_id).Userrost whoami
rost tenantsList tenants the user can access; the active one is marked current.Userrost tenants
rost use <tenant>Select a tenant slug or id as the active tenant for the session. It persists, so a following rost whoami reports it as current_tenant_id.Userrost use acme-ops

Reference and docs

CommandPurposeScopeSafe example
rost docsPrint the agent-facing how-to summary.Public referencerost docs
rost doctorDiagnose local CLI configuration: app URL, Supabase URL, installed version, PATH, session store, local Claude/Codex availability, and update status without printing tokens.Local environmentrost doctor
rost help [group]Print top-level usage, or one operation group's usage; rost <group> --help works too.Public referencerost help agent
rost reference <list|search|get> [options]Help syntax for public reference commands. --audience <human|cli|mcp|in_app_agent> filters to one audience (omit for all).Public referencerost reference search "onboarding" --audience cli
rost reference listList public reference guides.Public referencerost reference list --audience cli
rost reference search <query>Search public guides.Public referencerost reference search "MCP install" --audience mcp
rost reference get <slug>Print one public guide.Public referencerost reference get agent-reference-map

--audience <human|cli|mcp|in_app_agent> (on reference list and reference search) filters guides to those tagged for that audience. When omitted, all audiences are returned.

Onboarding

rost onboard preflight [--json]
rost onboard status
rost onboard resume
rost onboard run
rost onboard source-ingest --file <path> --source-key <key> --kind <kind> --title <title> [--json]
rost onboard setup --input '<json-plan>' | --input-file <path> [--json]
rost onboard setup-status --input '<json-plan>' | --input-file <path> [--json]
rost onboard rehearse|activate --setup-application-id <uuid> ... [--json]

Every tenant-scoped onboard verb (status, resume, source-ingest, setup, setup-status, rehearse, activate — onboard run is an offline public print) uses an existing implementation-bootstrap credential first. Only an absent credential leaves the user-session path available; expiry, read errors, authentication failures, and policy refusals stop without a principal change, so a co-resident owner session cannot silently take over an active implementation run. onboard source-ingest reads one local business file client-side, base64-encodes it, and calls onboarding.source_ingest; the server computes the digest and family manifest and returns the opaque source_ref to reference from the setup plan's sources[] (paths and client digests are rejected). Two size ceilings apply to this upload and the smaller one wins. The application's command-body cap is 1 MiB for most commands, but onboarding.source_ingest gets a selectively raised cap (≈ 6.7 MB, on both the REST and MCP command transports) sized for base64 expansion (×4/3). In front of that, the hosting platform enforces a lower request-body ceiling — measured at at least 4 MiB, the largest body proven to reach the function — and rejects a larger body at the edge before ROST sees it, so no ROST error can describe that failure. The platform ceiling is what sets the maximum size. The raised 6.7 MB application cap sits above it and so never rejects a body the platform would have delivered. The 5,000,000-byte protocol bound is still enforced — a larger file is refused on that ground first — but it too sits above the reachable size, so it never decides how large a source can actually be. Only the platform ceiling does, which is why raising the 6.7 MB cap on its own would not make a bigger source uploadable. After base64 expansion the largest source file this command can carry is therefore about 3.1 MB, short of the protocol's documented 5,000,000-byte source range; reaching that full range needs the platform ceiling raised, which is a separate change. The CLI derives its pre-check from the platform ceiling and names the exact fitting size before sending — split a larger export. onboard setup submits the complete declarative plan to onboarding.setup: staging succeeds with exit code 0 and prints the pending confirmation id plus the exact approval URL (with --json, the full pending-confirmation object). onboard setup-status re-submits the identical plan to discover state through the command's idempotent contract: after approval it returns the immutable applied receipt (application id, receipt revision, input digest) without staging anything; while approval is still pending it returns the current approval card — an identical still-valid card is reused with the same confirmation id and URL, and only a changed server-derived projection supersedes the stale card and mints a fresh one. After application, a same-key re-submission with a different plan digest is a typed conflict.

CommandPurposeScopeSafe example
rost onboard preflightPrint one pass/fail/unknown line per readiness condition (acting principal, implementation credential, CLI version, deployment reachability, pre-existing onboarding state) and exit nonzero on any fail or unknown. Runs before the session gate, so it works with no credentials.Public (reports on whatever credential resolves)rost onboard preflight --json
rost onboard statusReturn onboarding progress, graph summary, and next actions.Tenantrost onboard status
rost onboard resumeResume the guided onboarding flow where it left off.Tenantrost onboard resume
rost onboard runPrint the deterministic agent onboarding prompt.Public referencerost onboard run
rost onboard source-ingestRetain one bounded local business source (encrypted, tenant/run-bound) via onboarding.source_ingest and print the opaque source_ref for the setup plan.Tenant (implementation bootstrap or owner)rost onboard source-ingest --file org-chart.csv --source-key org-chart --kind org_chart --title "Org chart" --json
rost onboard setupStage the one-approval composite onboarding setup via onboarding.setup; prints the pending confirmation id and exact approval URL, or the applied receipt on an identical re-submission.Tenant (implementation bootstrap or owner)rost onboard setup --input-file setup-plan.json --json
rost onboard setup-statusDiscover the setup application state by idempotent re-submission of the identical plan: applied receipt after approval; while pending, the current approval card (an identical card is reused, same id and URL).Tenant (implementation bootstrap or owner)rost onboard setup-status --input-file setup-plan.json --json
rost onboard rehearseRun the applied setup receipt's agents through the resumable sandbox-only rehearsal batch via onboarding.rehearse; returns immutable terminal evidence, never an activation approval URL.Tenant (implementation bootstrap or owner)rost onboard rehearse --setup-application-id <uuid> --expected-input-digest <sha256:digest> --expected-receipt-revision 1 --idempotency-key rehearse-1 --json
rost onboard activateStage the one post-rehearsal owner approval via onboarding.activate with the exact unique-agent-ID rehearsal and configuration evidence arrays; it alone stages the activation URL.Tenant (implementation bootstrap or owner)rost onboard activate --setup-application-id <uuid> --expected-input-digest <sha256:digest> --expected-receipt-revision 1 --terminal-rehearsal-batch-receipt-id <uuid> --rehearsal-runs '[...]' --configuration-digests '[...]' --idempotency-key activate-1 --json
rost init [--client claude-code|codex|cursor] (defaults --scope tenant-admin)Log in when needed, install MCP, and print the onboarding prompt. As the first-run helper it defaults to a tenant-admin token (no seats exist yet); pass --scope seat --seat-id <id> to scope it narrower.User plus tenantrost init --client codex
rost init --tenant <tenant> --client <client>Select a tenant before MCP install.User plus tenantrost init --tenant acme-ops --client cursor

Implementation access

rost implementation access start|status|complete|abandon [--json]
rost implementation install-mcp --client claude-code|codex|cursor [--json]
CommandPurposeScopeSafe example
rost implementation access start [--source-client <client>]Start a bounded, owner-approved implementation run and store the short-lived rost_impl_ bearer in the separate implementation-bootstrap credential slot.Public (device-code owner approval)npx @rosthq/cli@latest implementation access start --source-client claude-code
rost implementation access statusShow the bootstrap run state and whether the implementation credential is still valid.Implementation bootstraprost implementation access status
rost implementation access completeClose the bootstrap run as completed. This revokes the implementation credential.Implementation bootstraprost implementation access complete
rost implementation access abandonClose the bootstrap run as abandoned. This revokes the implementation credential.Implementation bootstraprost implementation access abandon
rost implementation access install-mcp --client <client>Register the current rost_impl_ bearer with an MCP client. Uses the same bearer; no separate mcp_token.create.Implementation bootstraprost implementation access install-mcp --client codex

Direct command execution

CommandPurposeScopeSafe example
rost command <id> [--seat <seat-id>] --json [json-body]Execute a server-side command by id. Add --seat <seat-id> to run a seat-scoped command (e.g. task.list) against a specific seat.Command-definedrost command task.list --seat <seat-id> --json '{}'
rost command schema <id> [--json]Discover a command's exact input/output schema, help pointer, Trusted execution classification, and a worked example before calling it. With no login session (an implementation credential alone, or none) it is served from the bundled registry projection, offline; with a session it queries the live server so the contract matches the server being called. The underlying command.describe remains user-scoped for MCP/raw callers.Bundled (local/offline); server command is user-scopedrost command schema compass.draft
rost command list [--json]List every callable command id with its scope, confirmation gate, and Trusted execution classification. With no login session (an implementation credential alone, or none) it is served from the bundled registry projection, offline; with a session it queries the live server. The underlying command.list remains user-scoped for MCP/raw callers.Bundled (local/offline); server command is user-scopedrost command list
rost command onboarding.attach_reference --json ...Attach a company reference document (reference-only).Tenantrost command onboarding.attach_reference --json '{"text":"# Ops handbook\n...","title":"Ops handbook","kind":"process","source":"handbook/ops.md"}'
rost command seat.create --json ...Create a Responsibility Graph seat.Tenantrost command seat.create --json '{"name":"Finance","seat_type":"human"}'
rost command seat.create_complete --json ...Stage one complete Seat proposal containing its Charter, disclosed staffing, and optional dry-run agent configuration. It requires one owner confirmation and applies the approved proposal atomically; it never makes an agent live.Tenant owner or implementation bootstraprost command schema seat.create_complete --json
rost command charter.draft --json ...Create or fetch a draft Charter.Seat or tenant-adminrost command charter.draft --json '{"seat_id":"<seat-id>"}'
rost command confirmation.approve --json ...Approve a pending confirmation as a human.Tenantrost command confirmation.approve --json '{"confirmation_id":"<confirmation-id>"}'

Seat scope (`--seat <seat-id>`). Seat-operating commands run in a seat context. A seat-scoped MCP token already carries that context; a tenant or owner session does not, so pass --seat <seat-id> to target a specific seat — an owner can target any seat in the tenant, a member only a seat they occupy. The flag rides the x-rost-seat header out-of-band and is never part of the command body; the server resolves and authorizes the seat scope. It works on both the raw rost command <id> path and the ergonomic wrappers (e.g. rost task list --seat <seat-id>).

Regular operation wrappers

Ergonomic subcommands for everyday operation. Each wrapper is sugar over the same server-side command shown in the command-id column — it builds the JSON body from flags and routes through the same execution path as rost command <id> --json. Add --json to any wrapper for stable, machine-parseable output; without it the wrapper prints a concise line that still includes the ids needed for follow-up calls. rost command <id> --json remains the completeness floor for fields a wrapper does not expose.

These ergonomic wrappers (including the rost agent group) require rost 0.2.0 or newer — run npx @rosthq/cli@latest … to get them. Older versions can still reach every command through the rost command <id> --json floor, since command execution is server-side.

Generated verbs (0.6.0+). Every registry command now has a first-class rost <namespace> <action> verb, projected directly from the command's input schema — so namespaces that previously had no ergonomic wrapper (for example rost measurable create, rost work_order enqueue, rost mcp_token create) are usable without dropping to the raw command <id> path. Flags follow the schema field names (--seat-id, --name, …); read a command's exact input offline with rost <namespace> <action> --schema before calling it, and pass a nested payload with --input '<json>' or --input-file <path> (a JSON file read client-side) when a field is a complex object — explicit field flags merge on top of either payload form. On these generated verbs, a flag the verb does not support is a usage error naming the flag before anything is sent, never silently ignored (the bespoke handler verbs, such as status record and agent create, still parse flags by hand and are being hardened separately). --json still selects machine output, --seat <id> still sets seat scope, and rost command <id> --json '<body>' remains the universal fallback.

For a complete Seat, inspect rost seat create-complete --schema, then pass the strict nested request with rost seat create-complete --input '<json>' --json. The generic rost command seat.create_complete --json '<json>' path and the generated MCP tool rost_create_complete_seat expose the same registry schema and server-side command. seat create-complete uses an existing implementation-bootstrap credential first (it is one of the vetted bootstrap staging primitives); only an absent credential leaves the user-session path available. Expiry, read errors, authentication failures, and policy refusals stop without a principal change. Staging is the success outcome for this verb: the CLI exits 0 and prints the pending confirmation id and the exact approval URL (Approve once: <url>), and with --json it prints the pending-confirmation object verbatim for machines — the command has done its job at that point. The raw rost command seat.create_complete --json '<json>' path renders staging the same way — the pending-confirmation JSON on stdout, exit 0. The human owner reviews one card covering the Seat, canonical Charter and permission manifest, disclosed staffing, effective agent lane/readiness, exact pinned Skill versions and dependency state, and schedule. Approval applies the proposal in one transaction and returns its application and receipt ids. Any failure rolls back the whole proposal. An optional agent remains in dry_run; this command never approves go-live. Direct calls use existing parent and Steward Seat ids—logical references are reserved for the later composite onboarding flow. Retained source ingestion is not available on this direct command yet, so sources and every source_uses collection must be empty and planned staffing must omit source_ref; the command rejects source-backed provenance instead of accepting an unverified upload id or caller-supplied digest.

The signed-in app exposes the same Skill command surface at Skills, linked from the Agents page (the nav collapse moved it out of the primary sidebar). Use /skills to filter the tenant library, /skills/new to build canonical SKILL.md frontmatter with tool.catalog dependencies, /skills/import for bounded GitHub or upload imports, and each Skill detail page to review validation, publish, check Seat dependencies, and assign a published version. During /agents/new, agent_setup.get can return next_action: "choose_skills"; selected Skills are proposed immutable-version assignments and required Skill tools block sign-off/go-live until tool configuration is ready.

CommandCommand idsPurposeScopeSafe example
rost task list|accept|decline|complete|createtask.list, task.accept, task.decline, task.complete, task.create, task.confirm_proposal, task.decline_proposalOperate a seat's task queue and target-side proposal decisions.Seat / tenantrost task list --json; rost command task.confirm_proposal --json '{"id":"<task-id>"}'
rost status recordstatus.recordRecord measurable readings and goal status as a status event.Seatrost status record --measurable-id <id> --value 42
rost signal list|get|confirm|correctsignal.list, signal.get, signal.confirm_reading, signal.correct_readingRead and confirm Signal measurables.Seatrost signal list --json
rost goal list|create|update|status|reparent|reassign-owner|dropgoal.list, goal.create, goal.update, goal.set_status, goal.reparent, goal.reassign_owner, goal.dropManage Cascade goals. Scope varies by verb: status is seat-scoped, list/create need a tenant token, and update/reparent/reassign-owner/drop require tenant-admin. create with --kind company_objective authors the Cascade root and additionally requires an owner membership.Seat to tenant-adminrost goal list --json
rost friction list|file|resolve|linkfriction.list, friction.file_issue, friction.resolve, friction.link_taskFile and resolve Friction issues.Seatrost friction list --status open --json
rost escalation list|get|resolve|rejectescalation.list, escalation.get, escalation.resolve, escalation.rejectWork the steward escalation queue.Stewardrost escalation list --json
rost error list|resolve|supersedeerror_log.list, error_log.resolve, error_log.supersedeList active, acknowledged, resolved, or superseded product error logs and let a human acknowledge, resolve, or supersede stale errors with evidence links.Tenantrost error list --resolved active --json; rost error resolve --error-log-id <id> --reason "Fixed in PR #123"
rost sync brief|compile|completesync.brief.get, sync.brief.compile, sync.run.completeCompile, read, and complete a weekly Sync.Tenantrost sync brief --json
rost runner list|status|diagnose|repair|work-orders|revoke|serve|loginrunner.list, runner.status, runner.diagnose, runner.repair, work_order.list, runner.revoke, runner endpoint APIsInspect heartbeat and execute-readiness evidence, inspect work orders, diagnose offline runners, explain claimability gates, get repair guidance, revoke a runner, or run the headless local runner loop.Tenantrost runner diagnose --runner-id <id> --json; rost runner serve --once
rost runner install-service|start|stop|restart|status|logs|uninstall --name <name> [--user-code <code>]launchd/service manager (macOS today) + rost runner serveInstall and manage an always-on local runner service that keeps the runner online across reboots. The service runs the runner under the absolute Node binary with an explicit PATH (so it works under nvm/Homebrew) and bootstraps into whichever launchd domain the session supports. Pass --user-code to pair the service at install; otherwise install prints the exact command to pair it. No secret is stored in the service definition, its arguments, or logs. Non-macOS emits an explicit unsupported message.Tenant (local machine)rost runner install-service --name mac-mini --execute --user-code ABCD-EFGH; rost runner logs --name mac-mini
rost notification settings|test|errorsnotification.settings.get, notification.test, notification.list_errorsRead notification settings, send a test, and list failed deliveries with linked product error source, seat id, and run id when available.Tenantrost notification errors --limit 10 --json
rost integration list|readiness|status|test / credential flow for Baserow REST connectintegration.connect_rest, integration.list, integration.readiness, integration.status, integration.testCreate a vault-backed Baserow REST integration through the credential flow, list connector metadata, read setup-readiness, read one connector's health, and run provider-specific tests without exposing credentials.Tenant-admin for connect; tenant for reads/testsrost integration readiness --provider google --json
rost system healthsystem.healthRead the scoped system-health snapshot across agent runs, unresolved errors, Signals, Cascade setup, work loop, integrations, runners, notifications, and Sync Brief readiness.Tenant, member, or seat tokenrost system health --json; rost system health --seat <id> --json
rost command usage.report|usage.snapshotusage.report, usage.snapshotRead the AI-workforce ROI report (per-period agent turns, token/run cost, human-accepted value, exceptions, approvals) from immutable usage snapshots, and freeze a period's totals into a new snapshot (insert-only, idempotent).Tenantrost command usage.report --json; rost command usage.snapshot --json
rost settings get|update|product-learning|agent-policy|confirmation-mode|renamesettings.get, settings.update, settings.product_learning.get, settings.product_learning.update, settings.agent_policy.get, settings.agent_policy.update, settings.confirmation_policy.get, settings.confirmation_policy.update, tenant.renameRead tenant settings, update budget caps, read or update product-learning participation, read or set the company autonomy ceiling, read or set the CLI confirmation mode, and rename the company. Budget, product-learning, and policy updates stop at human confirmation in non-interactive CLI/MCP sessions; company rename is owner-only and human-gated.Tenant / Tenant-admin for updatesrost settings product-learning get --json; rost settings agent-policy get --json; rost settings confirmation-mode get --json; rost settings rename --company "Acme Operations"
rost command tenant.model_gateway_policy.updatetenant.model_gateway_policy.updateUnlock or relock managed models that lack a zero-retention (ZDR) tier (ADR-0019). Locked (default) restricts the AI Gateway to zero-retention-eligible managed models. Owner-only and human-gated; unlocking establishes an ADR-0018 §6 standing authorization and surfaces a per-model retention disclosure.Tenant-adminrost command tenant.model_gateway_policy.update --json '{"allow_non_zdr_models":true}'
rost member invite|update|removemember.invite, member.update, member.removeManage tenant members; execution requires an owner or admin membership.Tenantrost member invite --email ops@example.com --role member
rost agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|showagent_template.list, agent.create_from_template, agent.create_custom, agent_setup.get, agent_setup.update, agent.configure_tools, agent.run_dry_run, agent.go_live, agent.status, agent.run_now, agent.fleet_digest, agent.get_run, agent.show_markdownRun the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with --model and --effort), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, capture the fleet-health digest, read one run's transcript/error diagnostics, and show a markdown readout. Human CLI dry-runs print the rehearsal transcript and, when present, the per-tool preview labels (Would run, Blocked, Escalated) before go-live. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first.Tenant and seatrost agent fleet-digest --json
rost command agent.activation_receipt|agent.activation_sign|agent.trust.*agent.activation_receipt, agent.activation_sign, agent.trust.create, agent.trust.inspect, agent.trust.revoke, agent.trust.expire, agent.trust.supersedeBuild a secret-free activation receipt, sign the exact current digest, and create/inspect/revoke/expire/supersede bounded Trusted execution grants. Receipt and inspect are reads; sign and grant lifecycle writes are human steward/admin only and refuse stale receipt digests. When Company Guardrails are in enforce mode, agent.trust.create and agent.trust.supersede require an autonomy ceiling of at least high; observe remains non-blocking and preserves the default balanced Trusted path. agent.trust.supersede also refuses unconditionally when no active grant exists to replace, and its required expected_grant_id must match the currently active grant or the call is refused.Seat read; tenant writerost command agent.activation_receipt --json '{"agent_id":"<agent-id>"}'; rost command agent.trust.create --json '{"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}'
rost tools listtool.catalogList the discoverable tool catalog the builder reads (id, scope tiers, access levels, provider requirement, cost class, lane support, credential requirement, access policy, Trusted metadata, and execution-boundary guidance).Tenantrost tools list --json
rost skills list|get|file|assigned|check-dependenciesskill.list, skill.get, skill.file.get, skill.assigned.list, skill.check_dependenciesDiscover reusable Skills, read descriptors and stored package files, list approved Seat assignments, and compare required/optional tool dependencies with a Seat's signed Charter manifest. Skills are instructions, not authority.Tenant-admin; seat-scoped reads for assigned Skillsrost skills list --json; rost skills file --slug invoice-review --path SKILL.md
rost skills catalog|enable|install|syncskill.catalog, skill.enable_catalog, skill.install_local, skill.sync_localDiscover entitled ROST catalog Skills, enable a catalog Skill into the company library with human confirmation, and install or sync approved Skill files locally from ROST APIs. Private catalog source URLs and GitHub tokens never go to local agents.Tenant-admin for catalog enablement; seat-scoped sync for assigned Skillsrost skills sync --seat-id <id> --client codex; rost skills install rost/ap-review --seat-id <id> --client codex
rost skills create|update-draft|import|publish|assign|revokeskill.create, skill.update_draft, skill.import_github, skill.import_upload, skill.publish, skill.assign_to_seat, skill.revoke_from_seatCreate or import bounded text Skill packages, publish reviewed immutable versions, propose Seat assignments, and revoke future use without deleting historical activations. Publish, revoke, and approved assignment stop at human confirmation; blocked required tools cannot be approved.Tenant-admin writes; seat agents read assignments and escalate requestsrost skills import github --url https://github.com/acme/skills/tree/main/ap --json; rost skills assign --seat-id <id> --slug invoice-review --json
rost model listmodel.catalogList guided model tiers with recommendations, token prices, cost bands, best-fit work, and model ids for --model.Tenantrost model list --json
rost compass showcompass.show_markdownRender the current Compass as a clean markdown card for review.Tenantrost compass show --markdown
rost charter showcharter.show_markdownRender a seat's Charter as a clean markdown card for review.Tenantrost charter show --seat-id <id> --markdown
rost deliverable list|get|create|attachdeliverable.list, deliverable.get, deliverable.create, deliverable.attachList, get, create, or attach agent deliverables for a seat. Deliverables are durable work outputs visible across UI, CLI, and MCP.Tenant (list/get), Seat (create/attach)rost deliverable list --seat-id <id> --json; rost deliverable create --title "Brief" --kind brief
rost graph showgraph.getPrint a table view of the Responsibility Graph with explicit seat_id and parent_seat_id columns.Tenantrost graph show
rost seat list|get|create|create-complete|rename|reparent|decommissiongraph.get, seat.get, seat.create, seat.create_complete, seat.rename, seat.reparent, seat.decommission, seat.decommission_previewWork with seats as first-class CLI primitives. The existing rost seat list|get|create|rename|reparent|decommission help surface remains available. seat create-complete --input '<json>' stages one atomic complete-Seat proposal and stops at one owner confirmation; any agent remains dry-run. seat decommission --dry-run previews affected occupancies, agents, Charters, tokens, credentials, work orders, and schedules before the human-gated teardown.Tenant / Seat for targeted mutationsrost seat create-complete --schema; rost seat decommission --seat-id <id> --dry-run
rost forge project-create|project-list|request-create|request-list|request-show|request-pause|request-cancel|request-resumesoftware_factory.project.create, software_factory.project.list, software_factory.request.create, software_factory.request.list, software_factory.request.show, software_factory.request.pause, software_factory.request.cancel, software_factory.request.resumeCreate/list Forge projects, open/read governed Forge build requests, and control request lifecycle. Request create/list/show return scheduler_state: queued when a runner work order exists, parked when the Forge team is staffed but no paired online runner can claim it, when the owning seat's charter manifest is not signed (charter_manifest_not_signed), or when the owning seat has no active charter (charter_missing), and not_configured when the runner-lane Forge Seat is missing. Request list/show also return a failure record (what failed, why, and the one action to unblock) when a request is blocked by a fault — a stalled or crashed phase driver, a failed phase, an incomplete plan, an exhausted budget, or missing/unsigned charter authority — so a stopped build reads as failed with a retry or fix-and-resume action instead of an indefinite running state. Request detail also surfaces the signed, expiring dispatch preview with included order, held items, dependencies, estimated turns, runner requirements, and authority budget envelope. Parked runner-availability and not-configured states link to /settings/runners/setup, and runner pairing or the repair sweep re-enqueues the same pending intake idempotently; charter-authority parks (charter_manifest_not_signed, charter_missing) carry no runner-setup link and unblock by signing the manifest (charter.sign_manifest) or, when no active charter exists, creating or replacing a draft with charter.set (or charter.draft followed by charter.update_draft), approving it with charter.approve, and then resuming the request. Project creation plus pause/cancel/resume are tenant-admin, entitlement-gated, and human-gated; reads and request creation require the Forge add-on.Tenant / Tenant-admin for create and lifecycle controlsrost forge project-create --name "Leiluna app" --base-branch main; rost forge request-create --project <slug-or-name> --title "Add invoice export" (accepts --software-project-id <id> instead of --project too); rost forge request-pause --build-request-id <id> --reason "Operator hold"

Skills wrapper help:

rost skills list [--json]
rost skills catalog [--json]
rost skills get --slug <slug> [--json]
rost skills file --slug <slug> --path SKILL.md
rost skills enable rost/<slug> [--json]
rost skills install <slug-or-rost/slug> [--seat-id <id>] [--client claude-code|codex|cursor] [--version <n>] [--local-only] [--json]
rost skills install-implementation [--client claude-code|codex|cursor] [--tag <tag>] [--json]
rost skills sync --seat-id <id> [--client claude-code|codex|cursor] [--json]
rost skills assign --seat-id <id> (--skill <slug>|--slug <slug>|--skill-version-id <id>) [--approve] [--allow-blocked-proposal] [--json]
rost skills revoke (--assignment-id <id>|--seat-id <id> --skill <slug>) [--json]
rost skills publish (--slug <slug>|--skill-version-id <id>) [--allow-warnings] [--json]

rost skills install writes into the client Skills directory and records .rost-skill.json with skill_version_id, content_sha256, source, client, and installed_from: "rost_api". Set ROST_SKILL_INSTALL_ROOT to override the local root in CI or a sandbox. Use install for one Skill and sync as the default local-agent command because it installs every approved Skill assigned to the Seat and skips a local copy only when its recorded hash matches and the installed file's own sha256 and byte size verify against the package the server returned; an edited or truncated local file is reinstalled instead of being reported unchanged. For --client claude-code the root is $CLAUDE_CONFIG_DIR/skills — CLAUDE_CONFIG_DIR is the variable Claude Code itself reads — otherwise ~/.claude/skills; CLAUDE_HOME set on its own is a usage error with a migration instruction, and CLAUDE_HOME set alongside a different CLAUDE_CONFIG_DIR prints a notice that CLAUDE_HOME is ignored. For --client codex the root is $CODEX_HOME/skills, otherwise ~/.codex/skills. For --client cursor the root is ~/.cursor/skills. Catalog Skills land under <skills root>/rost/<slug>, except under ROST_SKILL_INSTALL_ROOT, where they land under <override root>/<client>/<slug>. A whitespace-only value for any of these variables is rejected rather than resolving somewhere unintended; an empty value means unset (the shell's FOO= cmd idiom for turning an inherited variable off) and falls back to the default root above. Entitlement failures mean the tenant cannot access that ROST catalog tier yet; stale local copies are fixed by rerunning sync; private catalog access is always served by ROST APIs, not by giving the agent a private GitHub credential.

ROST-maintained catalog entries are seeded from first-party Skill packages with stable content hashes, application descriptors, and declared required or optional tool dependencies. Catalog seed validation is fail-closed: a package with parser warnings is not published. Enabling a catalog Skill copies the current immutable version into the company library; later catalog refreshes update the global catalog row but do not silently rewrite already-enabled tenant Skill versions.

MCP registration

CommandPurposeScopeSafe example
rost mcp install --client claude-code|codex|cursor --scope tenant-admin|seat [--seat-id <id>] [--expires-in <days>|--no-expiry]Direct install syntax. --scope is required (seat is narrower — prefer it for day-to-day; tenant-admin can administer the whole company). --expires-in <days> (1..365) or --no-expiry sets the token TTL (default 90 days). Token minting always requires explicit interactive human review or a separately completed human handoff.Tenantrost mcp install --client codex --scope tenant-admin --expires-in 30
rost mcp install --client claude-code|codex|cursor --rotate <old-token-id> (inherits the old token's scope; no --scope)Rotate syntax. Mints a replacement, inherits the old token's scope/seat (so do not pass --scope), prints the new registration block, and revokes the old token.Tenantrost mcp install --client codex --rotate <old-token-id>
rost mcp install --client claude-code --scope tenant-adminMint a tenant-admin MCP token and print a Claude Code registration command.Tenantrost mcp install --client claude-code --scope tenant-admin
rost mcp install --client codex --scope tenant-adminMint a tenant-admin MCP token and print Codex TOML.Tenantrost mcp install --client codex --scope tenant-admin
rost mcp install --client cursor --scope tenant-adminMint a tenant-admin MCP token and print Cursor JSON.Tenantrost mcp install --client cursor --scope tenant-admin
rost mcp install --client <client> --scope seat --seat-id <seat-id>Mint a token limited to one seat (the narrowest scope — prefer for day-to-day).Seatrost mcp install --client codex --scope seat --seat-id <seat-id>
rost --helpPrint top-level CLI help.Public helprost --help
rost --version / rost -vPrint the installed CLI's own version and exit — no usage text, no auth.Public helprost --version

MCP tool and resource catalog

This catalog is the canonical machine surface — the rost_* tools your MCP client calls. Three different things are called "tools" in ROST; do not confuse them:

1. The MCP tools below — the rost_* surface your client actually calls to read and act. 2. `rost tools list` / `tool.catalog` (MCP rost_list_tool_catalog) — the agent-configuration catalog the builder reads when staffing an agent. It includes scope tiers, provider-neutral access levels, provider requirements, cost class, lane support, and Trusted metadata. It is selectable per agent, but selecting a tool is not itself a call; live handlers execute later only behind the signed manifest, guard, credentials, and bindings. 3. `rost model list` / `model.catalog` (MCP rost_list_model_catalog) — the guided model-tier catalog the builder reads for recommendations, effort, token prices, cost bands, and model id selection. 4. The "Available tools guide" (in the sidebar) — covers tool *categories* and governance, not a callable surface. See the available-tools-guide.

Sections below: Command discovery (2) · Public reference (3) · Tenant-admin tools (grouped by domain) · Seat-scoped operating tools (9) · MCP operation resources (13).

Command discovery tools

These read-only tools are available to any valid MCP token (like the reference tools). Use them to discover a command's exact contract before calling it, and when a command fails, read the error's help field and run the command it names.

ToolPurposeScopeSafe example
rost_describe_commandReturn a command's input/output JSON Schema, scope, confirmation gate, Trusted execution classification, MCP tool name, help pointer, guides, a validated example, and related commands.Any valid MCP tokenQuery {"command_id":"compass.draft"}
rost_list_commandsList callable command ids in bounded pages with title, scope, confirmation, Trusted execution classification, stages, and MCP tool name when callable. Supports q, category, stage, limit, and cursor.Any valid MCP tokenQuery {"q":"status","limit":10}

The equivalent CLI verbs are rost command schema <id> and rost command list. The discoverable tool catalog is rost tools list (MCP rost_list_tool_catalog, tenant-scoped).

Deferred tool schemas (JIT loading)

For tokens whose catalog of generated command tools is large, each operating command tool is still advertised in the tool listing by name with a one-line description, but its full input contract is deferred rather than sent up front — this keeps the default tool listing small for large catalogs. The description names the command's command_id. To call a deferred tool, first call rost_describe_command with that command_id to load its exact input and output contract, then call the tool with the real arguments; the tool is fully callable either way, only the delivery of that contract is deferred.

Deferral is threshold-gated: small catalogs keep their full per-command contracts with no change in behavior. The pinned core seat tools (rost_get_context, rost_escalate, rost_report_status, and the task tools rost_get_tasks, rost_accept_task, rost_decline_task, rost_complete_task) and the reference and discovery tools are never deferred.

Deferring a contract changes only what is advertised in tools/list. Authorization is unaffected: every call still passes the server-side guard against the seat's signed permission manifest and writes its audit row, exactly as described above — visibility into a tool's arguments is never a security control.

Public reference tools and resources

Tool or resourcePurposeScopeSafe example
rost_reference_searchSearch public reference guides.Any valid MCP tokenQuery {"query":"agent-reference-map","audience":"mcp"}
rost_reference_getRetrieve a bounded public guide payload by slug, or one requested section by section id/title. The response includes available sections for follow-up reads.Any valid MCP tokenQuery {"slug":"agent-reference-map","section":"mcp-surfaces"}
rost://reference/{slug}Read a public reference guide as a resource.Any valid MCP tokenResource rost://reference/mcp-and-cli-guide

Tenant-admin tools

These names are available to tenant-admin MCP tokens. They are aliases over the shared command layer and are audited as MCP tool calls. The list spans far more than onboarding — it groups, in order: onboarding, seats, Charter, confirmations, Compass, staffing, credentials/tokens, graph reads, agents, runners and work orders, notifications, members and settings, Signals, Cascade goals, Friction, tasks, Sync, and escalations.

Several rows here are seat-operating commands (task.create, the signal.*, goal.*, and friction.* families) surfaced because they are also tenant-admin-callable — which is why the CLI wrapper table marks them "Seat". Scope selection follows the Seat scope note above: a seat-scoped token already carries seat context and sees only the seat-scoped MCP tools registered for that token; a tenant or owner CLI session must pass --seat <seat-id> to act in a seat context. See the security-model-guide for the seat-vs-tenant authority principle.

ToolCommand idPurposeRequired scopeSafe example
rost_onboard_statusonboarding.statusInspect onboarding progress.TenantCall with {}
rost_advance_onboarding_steponboarding.advance_stepPersist the current onboarding step after validation.TenantCall with the next step after checking status.
rost_finish_onboardingonboarding.finishWrite the durable onboarding completion marker. It is written unconditionally; onboarding.status honours it only once every derived requirement passes.TenantCall once onboarding.status reports no missing requirements — a seat below the root, an active Compass, a Charter with a measurable, and a dry-run or live agent. A reference document is not required.
rost_ingest_onboarding_sourceonboarding.source_ingestRetain one bounded encrypted onboarding source for the current implementation run or direct owner setup.TenantCall with one source and its declared kind; use the returned logical source key in setup.
rost_apply_onboarding_setuponboarding.setupStage one atomic company setup proposal for owner review without making agents live.TenantSubmit the complete normalized plan; expect one human confirmation.
rost_rehearse_onboarding_agentsonboarding.rehearseRun the setup receipt's exact agents in a run-bound sandbox and return the complete immutable terminal batch plus per-agent evidence. It cannot activate agents, arm schedules, use credentials, mutate sources, send externally, or stage a confirmation.TenantInspect the live command contract, then pass the exact setup application, expected digest/revision, and idempotency key. A retry returns the same terminal evidence only when configuration is unchanged.
rost_activate_onboarding_agentsonboarding.activateStage one complete owner approval for the setup receipt's exact all-passed agent set; approval activates the group and completes onboarding atomically.TenantPass the terminal batch receipt id plus every per-agent rehearsal run and configuration digest returned by onboarding.rehearse; expect one approval URL.
rost_onboard_resumeonboarding.resumeReturn the machine-readable onboarding resume state (path choice, pending setup, next step).TenantCall with {}.
rost_attach_reference_documentonboarding.attach_referenceAttach a company reference document (text/markdown) with title/kind/source so Compass and Charters can cite it.TenantCall with text, a title, a kind, and a source.
rost_upload_org_contextonboarding.upload_contextBack-compat alias of onboarding.attach_reference.TenantPrefer rost_attach_reference_document; same widened schema.
rost_create_onboarding_inviteonboarding.create_inviteOwner/admin human-gated ordinary invite during onboarding; cohort beta-tester/design-partner flags are server-only.TenantCall with a business email, role, and strict ordinary invite flags.
rost_save_tenant_anthropic_keytenant.anthropic_key.saveStore a tenant model key through the vault.TenantUse only with a real human-provided secret.
rost_disable_tenant_anthropic_keytenant.anthropic_key.disableRevoke the active tenant Anthropic BYOK credential after managed fallback is available.Tenant-adminHuman-gated; call with {}. The old key value is never returned.
rost_create_seatseat.createCreate a Responsibility Graph seat.TenantCall with {"name":"Finance","seat_type":"human"}.
rost_create_complete_seatseat.create_completeStage one complete Seat, canonical Charter, disclosed staffing, and optional dry-run agent configuration as one atomic owner-confirmed proposal.TenantRead the schema first; direct calls use existing parent and Steward Seat ids. The command never makes an agent live.
rost_rename_seatseat.renameRename a seat.Seat or tenant-adminCall with seat_id and name.
rost_reparent_seatseat.reparentMove a seat under a new parent.Seat or tenant-adminCall with seat_id and parent_seat_id.
rost_set_seat_typeseat.set_typeSet a seat type.Seat or tenant-adminCall with seat_id and seat_type.
rost_preview_seat_decommissionseat.decommission_previewPreview retiring a seat: affected occupancies, agents, Charters, MCP tokens, credentials, work orders, and schedules. No mutation.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}; no confirmation.
rost_decommission_seatseat.decommissionRetire a seat: end occupancies, archive the Charter, revoke tokens/credentials, cancel schedules, tombstone event. No-orphan guarded.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}; expect confirmation.
rost_draft_chartercharter.draftCreate or fetch a draft Charter.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}.
rost_draft_all_charterscharter.draft_allDraft Charters for every active or vacant non-reserved seat (a vacant seat may be drafted before it is staffed; activation stays human-gated; reserved system/Forge role seats are excluded from both drafting and skip accounting).TenantCall after initial graph creation.
rost_update_charter_draftcharter.update_draftUpdate a draft Charter document.Seat or tenant-adminCall with charter_version_id and the full doc.
rost_set_chartercharter.setCreate or replace a seat's draft Charter from a full document in one call.Seat or tenant-adminCall with seat_id and doc; approve activates it (human gate).
rost_approve_chartercharter.approveApprove a draft Charter as a human owner.Seat or tenant-adminExpect confirmation when authority changes.
rost_preview_charter_signal_reconciliationcharter.preview_signal_reconciliationOwner-only dry run of how a draft Charter's declared Signals resolve against the Signals the company already tracks.Tenant-adminCall with charter_version_id; reads only, and returns the edit_revision to reconcile with.
rost_reconcile_charter_signalscharter.reconcile_signalsOwner-only Charter approval carrying an explicit adopt / move / create decision per colliding Signal declaration.Tenant-adminPreview first; pass its edit_revision and one resolution per colliding, unlinked declaration.
rost_skip_charter_draftcharter.skipMark a Charter draft as skipped.Seat or tenant-adminCall only when a human defers the seat.
rost_apply_charter_seat_type_recommendationcharter.apply_seat_type_recommendationApply a Charter's seat-type recommendation.Seat or tenant-adminCall after reviewing the draft.
rost_sign_charter_manifestcharter.sign_manifestRequest human confirmation for a permission manifest.Seat or tenant-adminUse after tool permissions are reviewed.
rost_list_pending_confirmationsconfirmation.listList in-flight confirmations awaiting a human decision, scoped to the caller's authority (owner sees all; a member sees seats they occupy plus any stored-target card they currently steward or administer; an agent sees its own seat).Seat or tenant-adminCall with {}.
rost_list_activation_approval_setsconfirmation.activation_set.listList agent-authored activation confirmation sets grouped by implementation run for human review.TenantCall with {}.
rost_draft_compasscompass.draftCreate a Compass draft.TenantCall with a concise Compass document.
rost_update_compass_draftcompass.update_draftReplace a Compass draft document.TenantCall with the compass_version_id from compass.draft as draft_id and the updated document.
rost_approve_compass_versioncompass.approve_versionActivate a Compass version by supersession.TenantCall after human review.
rost_reject_compass_draftcompass.reject_draftReject and remove a Compass draft.TenantCall when the draft should not proceed.
rost_answer_compass_gapcompass.answer_gapRecord a human answer for a Compass gap.TenantCall with gap_id and answer text.
rost_set_compasscompass.setCompatibility helper for setting Compass over MCP.TenantCall with the approved Compass shape.
rost_assign_user_to_seatstaffing.assign_userAssign a human user occupancy to a seat.Seat or tenant-adminCall with seat_id and user_id.
rost_assign_dry_run_agent_to_seatstaffing.assign_agent_dry_runAssign an agent occupancy in dry-run mode.Seat or tenant-adminCall only after Steward chain is clear.
rost_staff_seatstaffing.assignCompatibility helper for human, agent, or hybrid staffing.Seat or tenant-adminCall with seat_id and occupant.
rost_import_agent_definitionagent.import_definitionImport a strict, versioned agent definition into a canonical draft Seat/setup without credentials, placement ids, or go-live side effects.TenantHuman-gated; call with definition_json and optional idempotency_key. Review the resulting draft setup before tools, dry run, or go-live.
rost_go_liveagent.go_livePromote a dry-run agent seat to live, retiring the agent generation the promoted agent replaces on that seat.Seat or tenant-adminCall after human approval. Paused agents, and an agent pinned to another still-draft Charter version, are left in place.
rost_create_mcp_tokenmcp_token.createMint a tenant-admin or seat-scoped MCP token.TenantPrefer rost mcp install for users.
rost_revoke_mcp_tokenmcp_token.revokeRevoke an MCP token immediately.TenantCall with token_id.
rost_get_responsibility_graphgraph.getRead the Responsibility Graph: seats, edges, root, occupants, display-only planned occupants, status rollups.TenantCall with {} before mutating or routing work.
rost_get_seat_detailseat.getRead a seat's Charter ids, steward chain, occupancy, display-only planned occupants, agent status, token metadata, and open-work counts.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}.
rost_list_charterscharter.listList Charter versions, optionally by seat or status.TenantCall with {} or {"seat_id":"<seat-id>"}.
rost_get_chartercharter.getRead a Charter with supersession history and dry-run status.TenantCall with {"charter_version_id":"<id>"}.
rost_get_current_compasscompass.get_currentRead the active and draft Compass versions and source documents.TenantCall with {}.
rost_list_compass_gapscompass.list_gapsList unanswered and answered Compass context gaps.TenantCall with {} before answering gaps.
rost_get_agent_statusagent.statusRead agent lane, live state, steward chain, dry-run result, Runner availability.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}.
rost_list_agent_fleetagent.list_fleetRead every staffed agent seat at once: lane, live state, last real turn, 24h/7d real turns, measurable status, escalations, and 7-day spend, plus the liveness/health/work-progress axes the web fleet page renders (liveness state, health status, work evidence, host-resource pressure), plus an is_system marker for Forge system seats.TenantCall with {}; counts use the same seat-run association as agent.list_runs, with sandbox dry runs excluded from real turns.
rost_get_dogfood_fleet_health_digestagent.fleet_digestCapture the daily dogfood fleet-health digest: live/idle state, 24h/7d turns, spend, recent failed runs, unresolved errors, failed notifications, and next actions.TenantCall with {}; optional window_hours bounds recent failed-run evidence, while error_limit caps linked evidence per seat.
rost_system_healthsystem.healthRead the scoped system-health snapshot across agent runs, unresolved errors, Signals, Cascade setup, work loop, integrations, runners, notifications, and Sync Brief readiness.Tenant, member, or seat tokenCall with {}; optional seat_id narrows inside the caller's server-derived scope.
rost_get_run_heartbeatsagent.run_heartbeatsRead the per-seat run-heartbeat roll-up for long-running agent programs. state is one of working, quiet_healthy, recovered, stalled, or unavailable. A renewing lease alone never reports healthy: every roll-up is cross-checked against durable tool-call/event evidence first, and unavailable means that check could not be performed (the evidence read failed) — it is not a health verdict, so treat it as unknown rather than as healthy or stalled. Branch on state, not on the stalled boolean: when state is unavailable, stalled and stalled_run_count still report the lease (usually false/0) and are meaningless as a health signal. When stalled is true, stalled_run_count is always at least 1.TenantCall with {}; optional seat_ids narrows to specific seats.
rost_run_agent_nowagent.run_nowQueue a manual production run for a live staffed agent without changing its saved schedule; the output is production_manual. Cloud lane dispatches to the executor and runner lane queues for the paired runner.TenantA human with authority runs directly; same-Seat agent auto-execution requires bounded Trusted authorization; cross-Seat and implementation-agent requests require a human. Call with {"seat_id":"<seat-id>"}.
rost_list_agent_runsagent.list_runsRead a seat's agent run history (status, lane, model, cost, per-run Skill activation, tool-call, guard-denied, and guard-held counts) plus the seat's run/tool-call rollup including held-action count.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}; pass limit for a deeper window.
rost_get_agent_run_diagnosticsagent.get_runRead one run's diagnostic record: transcript reference, token/cost usage, outcome, linked product-visible run errors, and loaded Skill activation file metadata. File hashes/sizes identify the immutable source package, while model prompt text may be bounded or truncated.Seat or tenant-adminCall with {"seat_id":"<seat-id>","run_id":"<run-id>"}.
rost_list_agent_tool_callsagent.list_tool_callsRead a seat's tool-call ledger (tool name, guard result, manifest clause, outcome) with the held-action count as the hero metric. Never returns argument summaries or secret material.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}; pass held_only: true for only guard-held calls.
rost_watch_agent_runagent.watch_runRead a read-only live snapshot of one seat run: status/lane, derived current work-state, run-heartbeat (quiet-but-healthy vs stalled) with current phase, the persisted session transcript, and the run's tool-call step feed. Never returns secret material.Seat or tenant-adminCall with {"seat_id":"<seat-id>","run_id":"<run-id>"}; read-only and reflects the run's current live state.
rost_list_agent_deliverablesdeliverable.listList durable agent deliverables for a seat, including explicit outputs and successful-run summaries.Seat or tenant-adminCall with {"seat_id":"<seat-id>"}.
rost_get_agent_deliverabledeliverable.getRead one durable agent deliverable by id for a seat.Seat or tenant-adminCall with {"seat_id":"<seat-id>","deliverable_id":"<id>"}.
rost_accept_deliverable_valuedeliverable.acceptRecord a human-confirmed accepted value (USD) on a deliverable; owner-only and human-gated. Humans decide — agents cannot self-accept. Re-accepting records a correction as a new event.Tenant-adminCall with {"deliverable_id":"<id>","impact_value_usd":<number>}; expect human confirmation.
rost_reject_deliverable_valuedeliverable.rejectRecord a human-confirmed rejection on a deliverable; owner-only and human-gated. Humans decide — agents cannot self-reject. Re-rejecting records a correction as a new event.Tenant-adminCall with {"deliverable_id":"<id>","reason":"<why>"}; expect human confirmation.
rost_ai_workforce_roi_reportusage.reportRead the AI-workforce ROI report — per-period agent turns, token/run cost, human-accepted value, exceptions, and approvals — from immutable usage snapshots.TenantCall with {} or {"limit":<n>}.
rost_capture_usage_period_snapshotusage.snapshotFreeze the current (or a given) period's usage and accepted-value totals into an immutable snapshot; insert-only and idempotent.TenantCall with {} or {"period":"YYYY-MM-DD"}.
rost_list_agent_templatesagent_template.listList stock agent templates and metadata.TenantCall with {}.
rost_create_agent_from_templateagent.create_from_templateCreate a draft stock agent and draft Charter from a template (draft-only; occupancy needs a human steward).TenantCall with seat_id and template_slug; expect human confirmation.
rost_start_agent_setupagent_setup.startStart an agent setup draft for template, custom, or existing mode.TenantCall with mode and seat placement.
rost_get_agent_setupagent_setup.getRead agent setup state, blockers, and next action.Seat or tenant-adminCall with {"setup_id":"<id>"}.
rost_update_agent_setupagent_setup.updateUpdate parent, steward, lane, schedule, answers, or skill discovery on a setup draft.TenantCall with setup_id and the fields to change.
rost_update_agent_scheduleagent.update_scheduleUpdate a draft or live agent's scheduled execution.TenantCall with seat_id, schedule_cron, and optional canonical IANA schedule_timezone; output includes server-owned schedule_id and schedule_revision. Expect human confirmation.
rost_decommission_agentagent.decommissionRetire an agent occupancy safely (no-orphan guarded).TenantCall with agent_id; expect human confirmation.
rost_pause_agentagent.pausePause a live agent so it stops scheduled and on-demand runs; reversible.TenantCall with seat_id; expect human confirmation.
rost_resume_agentagent.resumeResume a paused agent back to live (no-orphan guarded).TenantCall with seat_id; expect human confirmation.
rost_re_lane_a_live_agentagent_setup.relaneRe-lane a live agent (cloud / runner / mcp_session): pause, move to the new lane, force a fresh dry-run rehearsal on that lane, then go live. Owner-only, human-gated, records a rationale; honours the substrate gate (an MCP target needs a seat-scoped token; a runner target with no paired runner goes live parked and cannot claim work until one pairs); a failed rehearsal leaves the agent paused on the new lane.Tenant-adminCall with {"seat_id":"<seat-id>","lane":"runner","reason":"Paired a Mac runner"}; expect human confirmation.
rost_create_custom_agentagent.create_customCreate a draft custom agent shell and draft Charter seed from operational answers.TenantCall with seat_id and operational answers; expect human confirmation.
rost_configure_agent_toolsagent.configure_toolsConnect or decline proposed tools and stage credential-ingress requests (vault refs only).Seat or tenant-adminNever send raw secrets; expect a credential confirmation.
rost_run_agent_dry_runagent.run_dry_runRun the sandbox dry run for a draft agent; durable and idempotent per Charter version.Seat or tenant-adminCall after the manifest is signed; ungated by human approval, but precondition-gated on a signed manifest.
rost_list_mcp_tokensmcp_token.listList MCP token metadata (never token material).TenantCall with {} or {"include_revoked":true}.
rost_list_runnersrunner.listList local runners with heartbeat health, execution readiness, queue counts, and recent result evidence.TenantCall with {}.
rost_runner_statusrunner.statusRead a single runner's capability, heartbeat health, and execute-readiness state.TenantCall with runner_id.
rost_diagnose_runnerrunner.diagnoseReturn runner health, claimability checks, capabilities, and repair guidance without secrets.TenantCall with runner_id; claimability exposes safe predicates, required vs actual values, pass/fail state, and remediation for claimable work.
rost_runner_repair_guidancerunner.repairReturn focused repair steps for a runner: restart, re-pair, revoke stale, or install missing CLI runtime.TenantCall with runner_id and optional issue (restart, re_pair, revoke_stale, missing_cli_runtime).
rost_start_runner_pairingrunner.pairing.startOpen a runner pairing session and return the human pairing code.Tenant-adminCall with name and platform; owner/admin only.
rost_list_pending_device_pairingsdevice.pairing.listList this tenant's live device pairing intents (pending code / awaiting approval) with each anchored device row and its one-click-approvable flag. Never returns the pairing code.Tenant-adminCall with {}; owner/admin only.
rost_revoke_runnerrunner.revokeRevoke a runner so it can no longer authenticate.TenantCall with runner_id; expect human confirmation.
rost_list_work_orderswork_order.listList runner/cloud work orders for the tenant.TenantCall with optional status, agent_id, or runner_id.
rost_enqueue_work_orderwork_order.enqueueQueue a work order for a live scheduled agent.TenantCall with agent_id.
rost_cancel_work_orderwork_order.cancelCancel a queued, claimed, or running work order.TenantCall with work_order_id; expect human confirmation.
rost_get_notification_settingsnotification.settings.getRead tenant notification preferences.TenantCall with {}.
rost_update_notification_settingsnotification.settings.updateUpdate tenant notification preferences.TenantCall with the fields to change.
rost_send_test_notificationnotification.testEmit an in-app test notification to the acting human.TenantCall with {}.
rost_list_notification_errorsnotification.list_errorsList recent failed notification deliveries with linked error_log_id, source, seat id, and run id when available.TenantCall with optional limit; source=run rows can be followed with agent.get_run.
rost_list_error_logserror_log.listList product error logs by seat, source, severity, and active/resolved state.TenantCall with {"resolved":"active"} before acknowledging stale failures.
rost_resolve_error_logerror_log.resolveAcknowledge or resolve an error log with a required human reason and optional task, issue, or PR link.TenantCall with error_log_id, reason, and disposition acknowledged or resolved.
rost_supersede_error_logerror_log.supersedeMark an older error log as superseded by a newer in-tenant error log.TenantCall with error_log_id, new_error_log_id, and reason.
rost_find_stale_error_logserror_log.stale_candidatesList unresolved error logs that have gone flat (no new occurrences) and are candidates for bulk resolution, with a per-row confidence tier and evidence. Read-only.TenantCall with optional stale_after_days and limit; feed the returned ids to error_log.bulk_resolve.
rost_bulk_resolve_error_logserror_log.bulk_resolveAcknowledge or resolve a batch of stale error logs in one human-confirmed action with a required reason; per-item partial success, one resolution event each, already-resolved or missing ids skipped.TenantHuman decision; expect confirmation. Call with error_log_ids, reason, and disposition.
rost_list_integrationsintegration.listList connected integration metadata and latest health state.TenantCall with {} or {"provider":"google"}; no secrets or vault refs are returned.
rost_check_integration_readinessintegration.readinessReturn the connector setup checklist: OAuth env/callback, tenant connection, scopes, latest test state, external verification/CASA, handler availability, and DER-coded next actions.TenantCall with {"provider":"google"}; metadata only, no secrets or vault refs.
rost_get_integration_statusintegration.statusRead one integration's metadata by provider or integration id.TenantCall with {"provider":"google"} or {"integration_id":"<id>"}.
rost_test_integration_connectionintegration.testRun the provider-specific connection test and update integration health.TenantCall with {"provider":"google"}; result is bounded metadata only.
rost_invite_membermember.inviteCreate a pending tenant invite for a human teammate.TenantOwner/admin only; call with email and role.
rost_update_member_rolemember.updateChange a tenant member's role.TenantOwner/admin only; call with member_id and role; expect human confirmation.
rost_remove_membermember.removeRemove a tenant member.TenantOwner/admin only; call with member_id; blocked if it would orphan an agent steward chain.
rost_get_tenant_settingssettings.getRead tenant operating settings and integration status.TenantCall with {}; metadata only.
rost_update_tenant_settingssettings.updateUpdate tenant AI budget caps.TenantCall with soft_cap_usd or hard_cap_usd; expect human confirmation.
rost_rename_companytenant.renameRename the current company.Tenant-adminCall with company_name; expect human confirmation.
rost_get_sync_brief_scopesettings.sync_brief_scope.getRead the tenant's Sync Brief scope (company_wide or per_cluster).TenantCall with {}.
rost_update_sync_brief_scopesettings.sync_brief_scope.updateSet the tenant's Sync Brief scope (company_wide or per_cluster).Tenant-adminOwner-only; call with {"sync_brief_scope":"company_wide"} or {"sync_brief_scope":"per_cluster"}.
rost_get_member_visibility_modesettings.member_visibility.getRead the tenant's member visibility mode (all or seat_subtree).TenantCall with {}.
rost_update_member_visibility_modesettings.member_visibility.updateSet the tenant's member visibility mode (all or seat_subtree).Tenant-adminOwner-only; call with {"member_visibility_mode":"all"} or {"member_visibility_mode":"seat_subtree"}.
rost_get_product_learning_policysettings.product_learning.getRead whether product/page/recommendation analytics are allowed.TenantCall with {}; audit/security logs are always enabled.
rost_update_product_learning_policysettings.product_learning.updateSet product-learning mode.Tenant-adminHuman-gated; call with {"mode":"enabled"}, {"mode":"disabled"}, or {"mode":"enterprise_contract"}.
rost_get_company_autonomy_ceilingsettings.agent_policy.getRead the company autonomy ceiling (Company Guardrails): profile, enforcement, and max_autonomous_risk.TenantCall with {}; metadata only.
rost_set_company_autonomy_ceilingsettings.agent_policy.updateSet the company autonomy ceiling.Tenant-adminOwner-only, human-gated; call with {"profile":"locked_down"} (or balanced/high_autonomy, or {"profile":"custom","max_autonomous_risk":"high"}). Enforced by default.
rost_get_cli_confirmation_modesettings.confirmation_policy.getRead the CLI confirmation mode: careful (the strict default — the CLI cannot silently auto-approve a pending confirmation) or trusted_operator (an owner opt-in).TenantCall with {}; metadata only.
rost_set_cli_confirmation_modesettings.confirmation_policy.updateSet the CLI confirmation mode.Tenant-adminOwner-only, human-gated; call with {"cli_mode":"trusted_operator"} (or {"cli_mode":"careful"}). Choosing trusted_operator establishes an ADR-0018 §6 standing authorization; a dangerous-risk confirmation always requires interactive human review in either mode.
rost_get_tenant_tool_policysettings.tool_policy.getRead tenant capability-grant defaults and the AICOS auto-trust posture.TenantCall with {}; metadata only.
rost_update_tenant_tool_policysettings.tool_policy.updateUpdate tenant capability-grant defaults and the AICOS auto-trust posture.Tenant-adminOwner/admin only and human-gated; call with {"mode":"managed","aicos":{"trust_new_capabilities_automatically":true}}.
rost_update_model_gateway_policytenant.model_gateway_policy.updateUnlock or relock managed models that lack a zero-retention (ZDR) tier.Tenant-adminOwner-only, human-gated; call with {"allow_non_zdr_models":true} (or false to relock). Unlocking establishes an ADR-0018 §6 standing authorization and surfaces a per-model retention disclosure.
rost_get_aicos_brain_settingsaicos.brain_settings.getRead AICOS lane and brain labels for cloud managed/BYOK, runner Claude/Codex, and MCP client.TenantCall with {}; returns enum labels only, never keys, vault refs, or runner secrets.
rost_update_aicos_brain_settingsaicos.brain_settings.updateUpdate AICOS lane and cloud/runner brain preferences.Tenant-adminOwner-only and human-gated; call with {"lane":"runner","runner_brain":"claude-cli"} or {"cloud_brain":"byok"}. BYOK requires an active tenant Anthropic key. For AICOS, selecting codex-cli is currently rejected until the governed interactive runner path is verified.
rost_list_signalssignal.listList measurables with their latest reading, on/off-track state, and effective_source (read-time measured-by).Seat or tenant-adminCall with {} to find measurable ids.
rost_get_signalsignal.getRead a measurable with its full reading history.Seat or tenant-adminCall with {"measurable_id":"<id>"}.
rost_confirm_signal_readingsignal.confirm_readingConfirm an unconfirmed reading as human-verified.Seat or tenant-adminHumans confirm; call with {"reading_id":"<id>"}.
rost_correct_signal_readingsignal.correct_readingOverwrite a reading with a human-confirmed value.Seat or tenant-adminManual correction; expect confirmation.
rost_add_a_measurablemeasurable.createAdd a measurable a seat owns (name, unit, direction, target, cadence).Seat or tenant-adminCall with {"seat_id":"<id>","name":"...","unit":"...","direction":"up_good","target":0,"cadence":"weekly"}.
rost_import_signals_from_csvsignal.importBulk-import measurable definitions + trailing historical readings from a parsed scorecard export (e.g. a ninety CSV). Owners resolve to seats; readings are human-confirmed; re-import upserts by (measurable, period, cadence); a cross-cadence row is reported and skipped, not overwritten.Tenant-adminOwner-only (DER-2030); call with the parsed measurables array.
rost_list_measurable_templatesmeasurable_template.listList the measurable template catalog (Sales/Finance/Ops/Marketing/HR) with unit, direction, cadence, and a suggested target.Seat or tenant-adminCall with {} or {"function":"sales"}.
rost_adopt_a_measurable_templatemeasurable_template.adoptCreate a seat measurable from a catalog template (unit/direction/cadence from the template; target optionally overridden). Adoption is a human act — source is human.Seat or tenant-adminCall with {"template_id":"sales.new_qualified_leads","seat_id":"<id>"}.
rost_read_the_scorecard_gridscorecard.gridRead the leadership scorecard trailing grid (rows = measurables of a cadence, columns = trailing periods, colour-coded cells) plus the computed Org-Checkup system-health measurables.Seat or tenant-adminCall with {} or {"cadence":"monthly","trailing":6}.
rost_discover_a_connection_for_signalsintegration.discoverRead-only introspection of a connected source: returns non-secret metadata and a recipe skeleton to author a signal pull against.Tenant-adminOwner-only (DER-2030); no network; call with {"integration_id":"<id>"}.
rost_preview_a_signal_sourcesignal.previewRun a candidate recipe live but read-only against an allowlisted HTTPS source; returns the extracted value and a short-lived preview_token. Never mutates; the credential is resolved from the connection at execution and never stored in the recipe.TenantCall with {"measurable_id":"<id>","integration_id":"<id>","recipe":{...}}.
rost_bind_a_signal_source_draftsignal.bindPersist the validated recipe as an inert draft binding; requires the preview_token from a preview of the same recipe, so nothing is bound that was not first seen working.Tenant-adminOwner-only (DER-2030); call with {"measurable_id":"<id>","integration_id":"<id>","recipe":{...},"cadence":"weekly","preview_token":"<token>"}.
rost_confirm_and_activate_a_signal_bindingsignal.bind_confirmHuman-only: activates a draft binding (draft -> active) so scheduled pulls begin writing confirmed readings. An agent that calls it produces a pending confirmation instead.Tenant-adminOwner-only (DER-2030); human confirms; call with {"binding_id":"<id>"}.
rost_import_friction_issues_from_a_ninety_issues_listfriction.importBulk-import issues as Friction items for the named owner seat (from a ninety Issues List export). Owners resolve to seats; idempotent re-import skips an open issue already imported for the same seat + summary; whole-file re-import is skipped by content hash.TenantCall with the parsed issues array.
rost_import_tasks_from_a_ninety_to_dos_exporttask.importBulk-import To-Dos as tasks the named owner seat owns (from a ninety To-Dos export), provenance origin_kind:manual. Owners resolve to seats; idempotent re-import skips a non-terminal task already imported for the same seat + title.TenantCall with the parsed todos array.
rost_import_rocks_from_a_ninety_rocks_exportcascade.importBulk-import Rocks as Cascade cycle goals under a company objective in the active cycle (from a ninety Rocks export). Owners resolve to seats; idempotent re-import skips a cycle goal already imported for the same objective + seat + title.TenantCall with the parsed rocks array.
rost_import_objectives_and_key_results_from_a_generic_okr_csvcascade.import_okrsBulk-import a generic OKR export into the Cascade (company objectives → company_objective goals, seat objectives → seat goals under them, metric KRs → measurables bound informs, milestone KRs → milestone goals under a seat objective). Owners resolve to seats; requires an active cycle; idempotent re-import matches existing goals/measurables/bindings, never duplicating them.TenantCall with the parsed objectives array (optionally parent_objective_id).
rost_import_a_ninety_v_to_into_a_compass_draftcompass.importAI-draft a Compass from a ninety V/TO (Core Values → principles, 10/3/1-Year → horizon goals, Rocks → cycle objectives), landed as a draft a human confirms by supersession — never an accepted Compass. Idempotent by document content (a re-upload of the same V/TO short-circuits without re-drafting).TenantCall with the extracted V/TO text (and optional source_name).
rost_list_cascade_goalsgoal.listList Cascade goals, optionally by cycle or seat.Seat or tenant-adminCall with {} or {"cycle_id":"<id>"}.
rost_get_cascade_goalgoal.getGet one goal's core detail and status by id. Seat-scoped callers may only read their own seat's goals.Seat or tenant-adminCall with {"goal_id":"<id>"}.
rost_list_a_cascade_goals_signalsgoal.list_measurablesList the goal's status-driving Signal binding (role drives_status; 0-or-1 per goal) with its current indicator and latest confirmed reading. Driver-only — informs bindings (direct indicators) are not returned. Read-only.Seat or tenant-adminCall with {"goal_id":"<id>"}.
rost_create_cascade_goalgoal.createCreate a Cascade goal. Default (no kind, or kind: "seat_goal"): a seat goal under an existing objective. kind: "company_objective" instead authors the Cascade ROOT.Tenant; a company objective additionally requires an owner membershipSeat goal: call with cycle, seat, parent, title, definition of done, and an optional target date. Company objective: {"kind":"company_objective","cycle_id":"<id>","title":"…","definition_of_done":"…"} — pass NO seat_id and NO parent_goal_id (the root has neither; supplying either is rejected, not ignored). The anchor is resolved server-side, so there is no id to pass, and the tenant's active one_year horizon goal must already be set or the call fails with a precondition error.
rost_update_cascade_goalgoal.updateUpdate a goal's title or definition of done.TenantCall with goal_id and the changed fields (title, definition of done, or target date).
rost_set_cascade_goal_statusgoal.set_statusSet a goal's status (on/off/done).Seat or tenant-adminSeats may set only their own goals.
rost_set_cascade_goal_progressgoal.set_progressReport a goal's quantified progress (0-100). An agent's progress is a proposal a human approves before the goal moves.Seat or tenant-adminSeats set only their own goals; expect confirmation.
rost_bind_a_signal_to_a_cascade_goalgoal.bind_measurableBind a measurable to a goal. Defaults to role informs — a conservative indicator allowed at any goal level (many per goal) that never changes status. Pass role drives_status to make it the goal's status driver (childless leaf only, one per goal); a driver requires a second_anchor (a prior closed period + expected value confirming the Signal matched the books) and promotes an existing informs binding of the same Signal. A new drives_status binding defaults auto_status_enabled to true (pass "auto_status_enabled":false to opt out at bind time); informs bindings are unaffected. Human-gated.Seat or tenant-adminCall with {"goal_id":"<id>","measurable_id":"<id>"} (add "role":"drives_status","second_anchor":{"period_start":"2026-Q1","expected_value":0} for the driver); expect confirmation.
rost_unbind_a_signal_from_a_cascade_goalgoal.unbind_measurableRemove a goal↔measurable binding (role defaults to drives_status; pass "role":"informs" to remove an indicator).Seat or tenant-adminCall with {"goal_id":"<id>","measurable_id":"<id>"}.
rost_toggle_signal_driven_auto_statusgoal.set_auto_statusPer-goal steward opt-in that lets the bound measurable's latest confirmed reading compute the goal's status (a new drives_status binding now defaults this to true; use this command to change it later). Enabling applies the current signal immediately. Human-gated.Seat or tenant-adminCall with {"goal_id":"<id>","enabled":true}; expect confirmation.
rost_list_at_risk_cascade_goalsgoal.list_at_riskList goals projected off pace (at-risk or projected-miss) with days behind pace. Read-only; status-only goals excluded.TenantCall with {}.
rost_reparent_cascade_goalgoal.reparentMove a goal under a new parent.TenantAuthority change; expect confirmation.
rost_reassign_cascade_goal_owner_seatgoal.reassign_ownerReassign a seat goal's owner seat to a different seat in the same tenant; cycle and parent ancestry are unchanged.TenantAuthority change; expect confirmation.
rost_drop_cascade_goalgoal.dropDrop (retire) a goal, retained for audit.TenantExpect confirmation.
rost_list_friction_issuesfriction.listList Friction issues ranked by impact and severity.Seat or tenant-adminCall with {} or {"status":"active"}.
rost_get_friction_issuefriction.getGet full detail for one Friction issue by id.Seat or tenant-adminCall with {"issue_id":"<id>"}.
rost_assist_friction_issuefriction.assistAdvisory IDS assist: the most-similar prior resolved issues with their root causes and decisions, a recurring-pattern flag, and recommended options. Read-only — it never resolves the issue.TenantCall with {"issue_id":"<id>"}.
rost_update_friction_issue_statusfriction.update_statusMove a non-terminal issue between open and diagnosing.Seat or tenant-adminCall with issue_id and status.
rost_resolve_friction_issuefriction.resolveResolve an issue with a root cause and remediation task.TenantHuman decision; expect confirmation.
rost_link_task_to_friction_issuefriction.link_taskAttach an existing task as an issue's action task.Seat or tenant-adminCall with issue_id and task_id.
rost_find_stale_frictionfriction.stale_candidatesList open or diagnosing Friction issues whose linked remediation task has already shipped, making them high-confidence bulk-resolution candidates, with per-row evidence. Read-only.TenantCall with optional stale_after_days and limit; feed the returned ids to friction.bulk_resolve.
rost_bulk_resolve_frictionfriction.bulk_resolveResolve a batch of stale Friction issues in one human-confirmed action with a required root cause (already-fixed mode, no follow-up task); per-item partial success, one human decision each, already-resolved or missing ids skipped.TenantHuman decision; expect confirmation. Call with issue_ids and root_cause.
rost_create_tasktask.createCreate a task (a commitment between seats).Seat or tenant-adminnone — human-created tasks go live directly; ordinary agent-created tasks become draft proposals; bounded Trusted proposals become offered or, for same-Steward live agent seats, in progress. Agent/scheduled producers may pass an optional source_key so a repeat proposal is an idempotent no-op (already_filed:true, no duplicate task).
rost_update_tasktask.updateReschedule, reassign, or edit a non-terminal task.Owner (tenant-admin)Pass task_id plus at least one of due_on/owner_seat_id/title/description; terminal tasks reject.
rost_compile_sync_briefsync.brief.compileCompile the weekly Sync Brief (idempotent per period).TenantCall with {}.
rost_get_sync_briefsync.brief.getRead the latest or a specific Sync Brief and agenda.Seat or tenant-adminCall with {} or {"sync_brief_id":"<id>"}.
rost_start_sync_runsync.run.startEnsure a Sync Brief exists so the meeting can begin.TenantCall with {}.
rost_complete_sync_runsync.run.completeRecord that the Sync meeting completed (idempotent).TenantCall with {"sync_brief_id":"<id>"}.
rost_assign_sync_follow_upsync.item.assignCreate a follow-up task from a Sync agenda item.TenantCall with brief, owner seat, title, description.
rost_list_escalationsescalation.listList Steward queue escalations (own steward chain for humans, own seat for agents). Each escalation that holds a replayable tool call also carries proposed_tool_call ({ tool_name, args_summary }, secret-scrubbed — never raw args).Seat or tenant-adminCall with {} or {"include_decided":true}.
rost_get_escalationescalation.getRead one escalation's secret-scrubbed evidence, recommendation, decision state, replay_action_summary (the held tool + originating run a steward approval would replay — never the raw args), and proposed_tool_call (the same held call's { tool_name, args_summary } payload, secret-scrubbed, present only when there is one).Seat or tenant-adminCall with {"id":"<escalation-id>"}. Resolve/reject are human-only and not exposed over MCP.
rost_find_stale_escalationsescalation.stale_candidatesList aged open escalations on the caller's steward chain that still reference a concrete DER issue or PR, with a per-row confidence tier and evidence. Read-only.TenantCall with optional stale_after_days and limit. The bulk override (escalation.bulk_resolve) is human-only and not exposed over MCP.
rost_check_compass_alignmentcompass.alignmentAdvisory drift check: scores whether cycle goals still ladder to the active vision and flags orphan/contradictory goals. Read-only — it never edits the Compass or any goal.TenantCall with {}.
rost_team_health_scoreteam.health_scoreRead the single rolled-up 0-100 team-health score (latest month) with its band and label.TenantCall with {}.
rost_show_compass_as_markdowncompass.show_markdownRender the current Compass and its open gaps as a clean markdown card for review.TenantCall with {}.
rost_show_charter_as_markdowncharter.show_markdownRender a seat's active or latest Charter as a clean markdown card for review.TenantCall with {"seat_id":"<seat-id>"}.
rost_show_agent_setup_as_markdownagent.show_markdownRender a seat's agent setup, model, steward, tools, and Charter as a clean markdown card for review.TenantCall with {"seat_id":"<seat-id>"}.
rost_list_tool_catalogtool.catalogList the discoverable tool catalog the agent builder reads — id, prescriptive description, scope tiers, credential requirement, access policy, and execution-boundary guidance.TenantCall with {} or {"provider":"google"}.
rost_list_tenant_capability_grantstool_grants.tenant.listList tenant capability ceilings/defaults with connection, availability, source, and compile status.TenantCall with {}; no secrets or vault refs.
rost_update_tenant_capability_policytool_grants.tenant.updateChange tenant-wide capability ceilings/defaults with optimistic policy version or digest protection.Tenant-adminHuman-gated; call with expected_policy_version or expected_policy_digest, mode, and grant ceiling changes. Returns changed grants, clamped defaults, and affected live agents.
rost_list_agent_effective_capability_grantstool_grants.agent.effectiveRead one agent's effective capability grants as a projection of the signed Charter manifest clamped by the tenant ceiling. Each grant carries provenance: grant_source (charter when the selected access comes from the signed manifest, else null) and ceiling_source (tenant_policy). This is the same computation the seat's Tools tab and the activation receipt project from, so the three agree — a charter-granted capability reads as granted, never a bare off.TenantCall with {"agent_id":"<agent-id>"}.
rost_build_agent_activation_receiptagent.activation_receiptBuild the current activation receipt for an agent: capabilities, connection metadata, digest, budget, and always-human boundary.Seat or tenant-adminCall with {"agent_id":"<agent-id>"}; rebuild after Charter, connection, lane, schedule, or grant changes.
rost_sign_agent_activation_receiptagent.activation_signHuman steward/admin sign-off for the exact activation receipt digest.TenantHuman-gated; call with {"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}.
rost_create_agent_trusted_grantagent.trust.createCreate a bounded Trusted execution grant for a live agent after receipt review. When Company Guardrails are enforced, the autonomy ceiling must be at least high; observe mode remains non-blocking.TenantHuman steward/admin only; call with {"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}.
rost_inspect_agent_trusted_grantsagent.trust.inspectInspect active or historical Trusted grants for one agent.Seat or tenant-adminCall with {"agent_id":"<agent-id>","include_inactive":true}; metadata only.
rost_revoke_agent_trusted_grantagent.trust.revokeRevoke an active Trusted grant while preserving history.TenantHuman steward/admin only; call with {"grant_id":"<grant-id>","reason":"..."}; non-interactive callers receive a confirmation handoff.
rost_expire_agent_trusted_grantsagent.trust.expireMark overdue active Trusted grants expired and append audit events.TenantHuman steward/admin only; call with {"agent_id":"<agent-id>"}.
rost_supersede_agent_trusted_grantagent.trust.supersedeReplace the active Trusted grant with a fresh digest and budget. Same company-autonomy-ceiling precondition as create; refuses unconditionally when there is no active grant to replace (it never creates one).TenantHuman steward/admin only; call with {"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500,"expected_grant_id":"<grant-id>"}; the exact active grant id is required and a changed or missing row is refused.
rost_list_blocked_awaiting_grant_interventionsagent_grant_intervention.listList durable blocked-awaiting-grant agent interventions with their missing grant, blocker kind, checkpoint, and decision state. Returns secret-scrubbed metadata only; a seat-scoped caller is clamped to its own seat. Pass include_decided to also return terminal (declined/resumed/expired) records.Seat or tenant-adminCall with {} (or {"seat_id":"<seat-id>","include_decided":true}).
rost_decide_a_blocked_agent_grantagent_grant_intervention.decideGrant (one-time, exact-action) or decline a blocked agent intervention. A grant writes a human decision and enqueues the linked continuation; the permanent grant kind never auto-widens — it returns requires_charter_resign so the surface routes the human to a Charter re-sign. A grant on a vault_credential blocker returns requires_secret_grant (a decide holds no vault ref and cannot mint the secret) so the surface routes the human to secret_grant.grant instead of clearing the block. A supplied action_digest must byte-match the record's or the grant expires instead of replaying a stale action. Human steward/admin only and human-gated.TenantCall with {"intervention_id":"<intervention-id>","action":"grant","grant_kind":"allow_once","action_digest":"sha256:..."}; non-interactive callers receive a confirmation handoff.
rost_resume_a_granted_agent_interventionagent_grant_intervention.resumeRetry ONLY the continuation enqueue for an already-granted blocked intervention whose enqueue did not complete. Never re-grants authority (the one-time grant is already committed). Human steward/admin only.TenantCall with {"intervention_id":"<intervention-id>"}.
rost_suggest_setup_capability_grantsagent_setup.capability_suggestionsSuggest deterministic minimum capability grants from the current setup/template and tenant grant availability.TenantCall with {"seat_id":"<seat-id>"} or {"setup_id":"<agent-id>"}; no model call and no mutation.
rost_list_skillsskill.listList tenant Skills with application descriptors, dependency metadata, source status, latest version, and assigned Seat count. Seat-scoped reads are available through rost://skills.Tenant-adminCall with {} or {"query":"invoice"}.
rost_list_rost_skill_catalogskill.catalogList entitled ROST catalog Skills. Private catalog source URLs and credentials stay server-side.Tenant-adminCall with {}; use {"include_unentitled":true} only to inspect tier availability.
rost_enable_rost_catalog_skillskill.enable_catalogEnable an entitled ROST catalog Skill into the company library with human confirmation.Tenant-adminCall with {"slug":"rost/ap-review"}; non-interactive callers receive a confirmation handoff.
rost_install_skill_locallyskill.install_localResolve company or entitled ROST catalog Skill files from ROST APIs for a local client install. It returns package files and metadata, not private GitHub URLs.Tenant-adminCall with {"slug":"invoice-review","client":"codex"}; rost/<slug> enablement may require confirmation.
rost_sync_assigned_skills_locallyskill.sync_localResolve every approved Skill assigned to a Seat plus revoked local-copy markers for a local client sync.Tenant-adminCall with {"seat_id":"<seat-id>","client":"codex"}; local clients remove revoked copies.
rost_get_skillskill.getRead one Skill descriptor and latest stored version metadata. Seat-scoped reads are available through rost://skills/{slug}.Tenant-adminCall with {"slug":"invoice-review"}.
rost_get_skill_fileskill.file.getRead stored Skill package file content by slug and package path; paths resolve only inside the stored package payload. Seat-scoped reads are available through rost://skills/{slug}/files/{path}.Tenant-adminCall with {"slug":"invoice-review","path":"SKILL.md"}.
rost_list_assigned_skillsskill.assigned.listList approved Skill assignments for a Seat, including immutable version, dependency status, rationale, and approval time. Seat-scoped reads are available through rost://seat/{id}/skills.Tenant-adminCall with {"seat_id":"<seat-id>"}.
rost_check_skill_dependenciesskill.check_dependenciesCompare a Skill version's required and optional tools with a Seat's active or draft Charter permission manifest. Returns ready/blocked/warning and suggested agent.configure_tools input; it never grants permissions.Tenant-adminCall with {"seat_id":"<seat-id>","slug":"invoice-review"}.
rost_create_skillskill.createCreate a tenant Skill draft or pending-review Skill from a bounded text package.Tenant-adminCall with {"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}.
rost_update_skill_draftskill.update_draftReplace or create the current unpublished draft version for an existing Skill.Tenant-adminCall with {"slug":"invoice-review","package":{"files":[{"path":"SKILL.md","content":"..."}]}}.
rost_import_github_skillskill.import_githubImport a public GitHub Skill package into pending review or draft after validation.Tenant-adminCall with {"url":"https://github.com/acme/skills/tree/main/ap","status":"pending_review"}.
rost_import_uploaded_skillskill.import_uploadImport a bounded structured text package. MCP does not accept direct binary uploads in this release.Tenant-adminCall with {"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}.
rost_publish_skillskill.publishHuman-gated publication of an unpublished Skill version. Published versions are immutable and assignable.Tenant-adminCall with {"slug":"invoice-review"}; non-interactive callers receive a confirmation handoff.
rost_assign_skill_to_seatskill.assign_to_seatPropose or human-approve a published Skill version for a Seat after dependency checks. Missing required tools block approval; optional tools warn.Tenant-adminCall with {"seat_id":"<seat-id>","slug":"invoice-review","status":"proposed","rationale":"Use for AP exception work."}.
rost_revoke_skill_from_seatskill.revoke_from_seatHuman-gated revocation that stops future Skill use without deleting historical activations.Tenant-adminCall with {"assignment_id":"<assignment-id>"}; non-interactive callers receive a confirmation handoff.
rost_list_model_catalogmodel.catalogList guided model tiers — recommendations, token prices, cost bands, best-fit work, and model ids for --model.TenantCall with {}.
rost_create_a_forge_projectsoftware_factory.project.createCreate an active Forge software project before binding repositories or opening build requests. Tenant-admin, human-gated, and entitlement-gated.Tenant-adminCall with {"name":"Leiluna app","slug":"leiluna-app","base_branch":"main"}; non-interactive callers receive a confirmation handoff.
rost_create_a_forge_build_requestsoftware_factory.request.createOpen a governed Forge build request against a connected software project; records the request plus its initial intake phase run and returns scheduler_state so MCP callers can distinguish queued work from parked runner setup or not_configured staffing gaps. Requires the Forge add-on; the title is untrusted display text.TenantCall with {"project":"<slug-or-name>","title":"Add invoice export"} (or {"software_project_id":"<project-id>", ...}).
rost_pause_a_forge_build_requestsoftware_factory.request.pausePause an in-flight Forge build request. New runner claims stop immediately; running work halts at the next task checkpoint. Human-gated.Tenant-adminCall with {"build_request_id":"<request-id>","reason":"Operator hold"}; non-interactive callers receive a confirmation handoff.
rost_cancel_a_forge_build_requestsoftware_factory.request.cancelCancel a Forge build request and expire active runner work orders. This is terminal; use pause for reversible holds. Human-gated.Tenant-adminCall with {"build_request_id":"<request-id>","reason":"Out of scope"}; non-interactive callers receive a confirmation handoff.
rost_resume_a_forge_build_requestsoftware_factory.request.resumeResume a paused or human-blocked Forge build request from the last completed task checkpoint and requeue the current phase. Human-gated.Tenant-adminCall with {"build_request_id":"<request-id>","reason":"Budget raised"}; non-interactive callers receive a confirmation handoff.
rost_list_forge_projectssoftware_factory.project.listList active Forge software projects so a tenant can choose a project for build requests, GitHub repository bindings, and config.TenantCall with {}; use the returned id as software_project_id.
rost_list_forge_build_requestssoftware_factory.request.listThe Forge control-room board: build requests with status, current phase, risk, current scheduler_state remediation, and a failure record (what failed, why, and the one action to unblock) on a request blocked by a fault. Read-only; requires the Forge add-on.TenantCall with {} or {"limit":20}.
rost_show_a_forge_build_requestsoftware_factory.request.showThe Forge request detail: the request, current phase, signed dispatch preview, phase-run history, gates, current scheduler_state remediation, and a failure record (what failed, why, and the one action to unblock) on a request blocked by a fault. Read-only; requires the Forge add-on.TenantCall with {"build_request_id":"<request-id>"}.
rost_advance_a_forge_build_request_phasesoftware_factory.phase.advanceAdvance a build request to its next phase; the server enforces the closed phase state machine and rejects an illegal transition.TenantCall with {"build_request_id":"<request-id>","to_phase":"discovery_scoping"}.
rost_decide_a_forge_gatesoftware_factory.gate.decideA human approves or rejects a Forge gate; an agent caller routes to /approvals and can never self-approve. Sensitive gates record a linked human decision.TenantCall with {"gate_id":"<gate-id>","decision":"approve"}; non-interactive callers receive a confirmation handoff.
rost_serialize_a_forge_dispatch_collisionsoftware_factory.dispatch.serializeA human appends a tightening depends_on edge to serialize two colliding Forge tasks (advisory-driven; never auto-blocks). Records a human decision.Tenant-adminCall with {"build_request_id":"<request-id>","before_task_key":"<key>","after_task_key":"<key>"}; non-interactive callers receive a confirmation handoff.
rost_answer_forge_plan_clarificationssoftware_factory.request.answer_clarificationWrite structured human answers to a draft plan's clarifying questions and optionally mark it ready for plan review; answers append to the versioned planning artifact and never widen authority or automation mode.TenantCall with {"build_request_id":"<request-id>","answers":[{"question":"Which database?","answer":"Postgres"}],"mark_ready_for_plan_review":true}.
rost_approve_a_forge_plansoftware_factory.plan.approveA human approves the current plan at the plan_review gate; records a human decision and advances the request to implementation. Owner-only and human-gated.Tenant-adminCall with {"build_request_id":"<request-id>"}; non-interactive callers receive a confirmation handoff.
rost_reject_a_forge_plansoftware_factory.plan.rejectA human rejects the current plan (with a required rationale) and routes the request back to discovery/scoping for re-planning. Owner-only and human-gated.Tenant-adminCall with {"build_request_id":"<request-id>","rationale":"Scope too broad"}; non-interactive callers receive a confirmation handoff.
rost_list_forge_authority_profilessoftware_factory.authority_profile.listList the tenant's Forge authority profiles (seat capability presets, read-only by default). Read-only; requires the Forge add-on.TenantCall with {}.
rost_create_a_forge_authority_profilesoftware_factory.authority_profile.createDefine a Forge authority profile (a named seat capability preset). Owner-only; defaults to the read_only preset.Tenant-adminCall with {"name":"Builder","preset":"contributor"}.
rost_grant_forge_seat_authoritysoftware_factory.authority.grantGrant a seat a Forge authority profile on a project (seat → project → profile). Owner-only and human-gated; emits a durable authority-change event.Tenant-adminCall with {"software_project_id":"<project-id>","seat_id":"<seat-id>","authority_profile_id":"<profile-id>"}; non-interactive callers receive a confirmation handoff.
rost_revoke_forge_seat_authoritysoftware_factory.authority.revokeRevoke a Forge authority grant (teardown). Owner-only and human-gated.Tenant-adminCall with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff.
rost_install_forge_developer_teamsoftware_factory.developer_team.installInstall AND activate the governed Forge Developer Team: Forge Lead (human) plus Planner, Builder, plan reviewer, security reviewer, QA/release, Fold/Memory, and Release Manager seats with draft Charters, first-party Forge Skills, and authority presets. Approving ALSO auto-staffs the 7 agent seats as live occupancies at a pull-request-only, observe-first posture (open pull requests, never merge/deploy without a human — the Release Manager auto-merges only after a human raises the automation-mode ceiling), steward-chained to the human lead, each with a signed manifest + passed sandbox dry-run; the 7 agent seats staff the runner lane and go live in a PARKED state — they become claimable once a runner pairs and cannot claim work before then; it sets a conservative default token budget (only if none) and, for a supplied project, a default pr_only GitHub automation policy (only if none — never widening a stricter one). Entitlement-gated and human-gated.Tenant-adminCall with {"steward_seat_id":"<human-steward-seat-id>"} — software_project_id is optional (when supplied it scopes authority grants to that project; the team installs tenant-wide either way). If the company autonomy ceiling is more permissive than the observe-first envelope, add {"acknowledge_autonomy_ceiling":true} to activate. Add {"lane_overrides":{"qa_release":"cloud"}} to pin a role to the cloud lane instead of the default runner lane. Non-interactive callers receive a confirmation handoff.
rost_uninstall_forge_developer_teamsoftware_factory.developer_team.uninstallTear down the governed Forge Developer Team (teardown — ADR-0018 §6): end the auto-staffed agent occupancies in a no-orphan-safe order, decommission the agents, and revoke the team's project authority and secret grants. The human Forge Lead seat is left intact; re-installing re-staffs the team. The entitlement-lapse variant runs the same teardown path without re-checking the Forge paywall. Owner-only and human-gated.Tenant-adminCall with {} (optionally {"reason":"offboarding"}); non-interactive callers receive a confirmation handoff.
rost_list_forge_configsoftware_factory.config.listList active Forge configuration entries. Plain values may be returned only when they passed the non-secret guard; secret refs appear as metadata and never include the ref value.TenantCall with {} or {"software_project_id":"<project-id>","environment":"preview"}.
rost_set_forge_configsoftware_factory.config.setHuman-gated config create/rotation for plain values or secret refs. Secret refs store only a vault pointer and raw secret-shaped plain values are rejected.Tenant-adminCall with {"software_project_id":"<project-id>","environment":"preview","key_name":"PUBLIC_BASE_URL","value_kind":"plain","plain_value":"https://preview.example.com"}.
rost_list_forge_secret_requestssoftware_factory.secret_request.listList missing-secret requests and their approval Task ids/statuses. It returns request metadata only — no secret values and no vault refs.TenantCall with {} or {"status":"pending"}.
rost_grant_a_forge_secretsoftware_factory.secret.grantA human grants a seat scoped access to a project secret by vault ref (Postgres stores only the pointer, never secret material). Owner-only and human-gated.Tenant-adminCall with {"software_project_id":"<project-id>","environment":"production","seat_id":"<seat-id>","action":"vercel.env.sync","key_name":"OPENAI_API_KEY","vault_ref":"infisical://prod/OPENAI_API_KEY"}.
rost_revoke_a_forge_secret_grantsoftware_factory.secret.revokeRevoke a Forge secret grant (teardown — cut a compromised seat's access immediately). Owner-only and human-gated.Tenant-adminCall with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff.
rost_set_a_forge_github_automation_policysoftware_factory.github.policy.upsertSet the server-side GitHub automation policy: allowed actions, automation-mode ceiling, and operations requiring humans. The allowed-actions and human-gated-actions lists are stored server-side as structured JSON arrays. Owner-only and human-gated. Raising the ceiling to a merge-capable mode (merge_after_checks or higher) first verifies the bound repository has required status checks on its default branch and refuses otherwise. Optional max_risk (low|medium|high|critical) tightens the fixed inferred-risk→mode-ceiling table per policy — an inferred risk strictly above max_risk is capped to plan_only; unset keeps the existing fixed-table behavior exactly, and critical inferred risk always stays plan_only regardless of max_risk (invariant #10, tighten-only).Tenant-adminCall with {"software_project_id":"<project-id>","automation_mode_ceiling":"pr_only","allowed_actions":["webhook_intake","installation_token"],"requires_human_for":["deploy_production"],"max_risk":"medium"}.
rost_create_a_forge_github_installation_tokensoftware_factory.github.installation_token.createMint a short-lived GitHub App installation token for one bound repository after policy evaluation. The token is returned once and never stored.TenantCall with {"software_project_id":"<project-id>","repository_id":789,"requested_actions":["read"],"requested_automation_mode":"plan_only"}.
rost_list_forge_github_installationssoftware_factory.github.installation.listList connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only.TenantCall with {}; a connected repository is verified but not yet bound to a project.
rost_list_forge_vercel_linkssoftware_factory.vercel.project.listList connected Vercel accounts/teams and linked existing Vercel projects. Read-only; no OAuth tokens or vault refs are returned.TenantCall with {}; tenant admins connect/link from /forge/settings/vercel.
rost_create_a_forge_vercel_preview_deploymentsoftware_factory.vercel.deploy_previewCreate a Vercel preview deployment for a linked project after Forge deploy-preview authority, the Vercel OAuth vault-ref connection, and required preview secret/config grants are verified.TenantCall with {"software_project_id":"<project-id>","commit_sha":"<sha>","git_ref":"feature/example","seat_id":"<seat-id>"}; returns deployment metadata, not tokens.
rost_list_forge_runner_capacitysoftware_factory.capacity.listList Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on.TenantCall with {} or {"runner_id":"<runner-id>"}.

The web Forge control room at /forge uses the same command path for project selection, build request creation/list/detail reads, request pause/cancel/resume controls, runner capacity, configuration status, and Developer Team install. Request cards and detail pages surface scheduler_state directly: queued work shows its work-order state, parked work explains why it is parked — no paired online runner is available, the owning seat's charter manifest is not signed (charter_manifest_not_signed, blocked until the manifest is signed with charter.sign_manifest and the request is resumed), or the owning seat has no active charter (charter_missing, blocked until a draft is created or replaced with charter.set (or charter.draft + charter.update_draft), approved with charter.approve, and the request is resumed) — and not-configured work sends the operator to /settings/runners/setup. A request detail page also shows phase history, open gates, plan progress, loop/time/cost ceilings, and latest plan-review questions from software_factory.request.show; answering a clarification, approving a plan, rejecting it, pausing, canceling, or resuming calls the same Forge commands exposed over CLI/MCP. Lifecycle controls deliberately stage pending confirmations before changing runner state. The install button also stages a pending confirmation before durable seats, Skills, authority grants, or live agent activation are applied; the install page states plainly that approving activates the 7 agents at a pull-request-only, observe-first posture and surfaces the company autonomy ceiling.

#### Forge GitHub App access

Forge repository access is through a tenant-bound GitHub App installation, not through a human's ambient git or gh credentials. The server verifies GitHub webhook signatures before parsing payloads, resolves the installation and repository against active tenant bindings, records delivery ids for idempotency, and creates GitHub issue build requests only when an active repo binding and policy allow intake.

Installation tokens are short lived and are not stored. The durable record is audit metadata: installation id, repository id, requested action, policy decision, reason, and related Forge request when one exists. GitHub issue titles, labels, and bodies are treated as untrusted source content; labels may request an automation mode, but only server-side Forge automation policy can allow pr_only, merge_after_checks, deploy_preview, or deploy_production. Production deploy remains human-gated.

Tenant GitHub App connect and bind are intentionally not CLI or MCP mutation tools; only the read software_factory.github.installation.list is exposed. Start at /forge/settings/github. Connect and bind are decoupled (DER-1281): user-scoped GitHub App authorization verifies the repositories you administer server-side and records them as connected (unbound, no project) via software_factory.github.installation.connect — this persists on any successful ownership proof, not only the one-shot post-install redirect, so a missed setup redirect is no longer fatal (a persistent "Verify ownership & add repositories" action re-runs it any time). Binding is a separate, always-available step: software_factory.github.installation.bind maps a connected repository to a Forge project (no GitHub re-authorization), and software_factory.github.repository.unbind returns a repository to connected/unbound (re-bindable) or disconnects it. Token minting and issue intake only ever see active (bound) repositories, so an unbound repository never enters automation.

The Forge GitHub App itself is org-owned. App private key, webhook secret, and client secret values are platform-owned ROST operator credentials stored through the vault's reserved ROST system namespace, not through a customer tenant namespace or a tenant UUID deployment variable. Manifest conversion and manual secret storage also require the app-level GITHUB_APP_OPERATOR_EMAILS allowlist, which should contain only approved ROST platform operator emails. Deployment config carries only refs (GITHUB_APP_PRIVATE_KEY_REF, GITHUB_APP_WEBHOOK_SECRET_REF, GITHUB_APP_CLIENT_SECRET_REF); raw secret env vars are local/legacy compatibility only. The dogfood app is ROST Forge under agenticoperatingsystem with App ID 4208495 and Client ID Iv23liImH7qlBvXYQ0Wx. The base app omits administration and workflows; elevated repo creation or workflow mutation needs a separate human-approved power path.

#### Forge Vercel access

Forge Vercel access is through a tenant-bound OAuth connection, never a browser-visible token. Tenant admins start at /forge/settings/vercel; the callback exchanges the short-lived Vercel code server-side, stores the access token in the vault, and records only account/team metadata plus the vault-ref pointer via software_factory.vercel.connection.connect. Existing Vercel projects are linked through software_factory.vercel.project.link; greenfield project creation is intentionally absent from this slice and requires a future explicit authority flag.

Preview deployment creation is a governed command. software_factory.vercel.deploy_preview requires an active Vercel project link, a Vercel OAuth vault-ref connection, active deploy_preview Forge authority for the requesting seat when a seat is supplied, and any requested preview secret/config grants. It writes the deployment id, URL, commit SHA, checks, status, and error metadata into software_vercel_deployments; build-request deployments also write a Forge artifact and event. Raw OAuth tokens and vault refs are never returned.

#### Secret broker grants (tenant-level)

Generalized brokered-secret egress beyond Forge (DER-1738). A human grants an agent seat a scoped secret the secret.broker egress tool and the baserow.read/baserow.write tools (DER-1739) resolve server-side; Postgres stores only a vault-ref pointer, never secret material. A seat agent asks for and lists its own grants through the seat-scoped secret_grant.request / secret_grant.list tools (in Seat-scoped operating tools below); a human grants and revokes here. To grant, pass credential_id (from credential.list, DER-1777) instead of a raw vault_ref — the command resolves the ref server-side so no product flow ever exposes it. Baserow authenticates with an Authorization: Token <key> header, so a Baserow grant uses injection_mode: "header", injection_name: "Authorization", and injection_prefix: "Token " (DER-1785) — the broker prepends the prefix to the raw key at render time, so the credential's vault secret stays the RAW key and granting it by credential_id renders Authorization: Token <key> correctly. (injection_prefix is non-secret config, capped at 32 chars, rejects control characters, and is invalid for injection_mode: "header_bearer", whose Bearer prefix is implicit.) Older grants that instead stored the full Token <key> string as the vault secret with no prefix still work — the broker injects that verbatim.

ToolCommandWhat it doesScopeNotes
rost_grant_a_brokered_secretsecret_grant.grantA human grants a seat scoped brokered-secret access. Supply exactly one of credential_id (from credential.list / credential.ingress — resolved to its vault ref server-side, so a human never handles a ref) or vault_ref directly. Postgres stores only the pointer, never secret material. Owner-only and human-gated; the secret.broker and baserow.* tools resolve it server-side and the secret never enters agent context.Tenant-adminCall with {"seat_id":"<seat-id>","grant_key":"baserow","provider":"baserow","allowed_host":"baserow.example.com","allowed_path_prefix":"/api/database/rows/","allowed_methods":["GET","POST","PATCH"],"scope_tier":"write","injection_mode":"header","injection_name":"Authorization","injection_prefix":"Token ","credential_id":"<credential-id>"} (or "vault_ref":"infisical://prod/baserow-token" instead of credential_id). injection_prefix is optional; use it (DER-1785) when the credential stores a RAW key so the broker renders "Token <key>".
rost_revoke_a_brokered_secret_grantsecret_grant.revokeRevoke a brokered secret grant (teardown — cut a compromised or over-scoped seat egress immediately; the next broker call fails closed). Owner-only and human-gated.Tenant-adminCall with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff.
rost_list_stored_credentialscredential.listList the tenant's stored credentials as metadata only — credential id, provider, label, seat, status, and created/rotated/revoked dates. NEVER returns the vault ref or any secret. Use the returned credential_id with secret_grant.grant.Tenant-adminCall with {}.

Seat-scoped operating tools

Seat-scoped MCP tokens expose the operating protocol below. The server still checks the seat's permission manifest, Charter, task ownership, and tenant boundary. These are the seat-token equivalents of the CLI rost task / rost signal / rost friction wrappers and the tenant-admin task tools above: rost_get_tasks, rost task list, and task.list are the same operation reached three different ways. The command-id column makes the mapping explicit.

ToolCommand idPurposeScopeSafe example
rost_get_context(read) seat-context bundleRetrieve the seat's Charter, Compass, goals, tasks, issues, and protocol instructions. Equivalent to reading rost://seat/{id}/context with a seat-scoped token. Carries compass_status — see "When the vision is withheld" below.SeatCall first with {}.
rost_get_taskstask.listList open tasks visible to the seat. Each task's due_on is an ISO date string (YYYY-MM-DD) or null.SeatCall with {}.
rost_accept_tasktask.acceptAccept a task owned by the seat.SeatCall with {"task_id":"<task-id>"}.
rost_decline_tasktask.declineDecline a task with a reason.SeatCall with task_id and reason.
rost_report_statusstatus.recordWrite a status event.SeatCall with a concise status payload.
rost_complete_tasktask.completeComplete a task and record evidence.SeatCall with task_id and evidence.
rost_escalateescalation.raiseEscalate approval-scope or must-escalate work.SeatCall with reason and requested decision; pass an optional short title (≤90 chars) for the "Needs you" headline and keep the long narrative in reason.
rost_file_issuefriction.file_issueFile a Friction issue.SeatCall with summary, severity, and evidence; pass an optional short title (≤90 chars) for the headline and keep the long narrative in summary. Agent/scheduled producers may pass an optional source_key for deterministic idempotency — a repeat filing with the same key returns the existing open issue with already_filed:true and creates nothing new.
rost_log_workwork.logRecord a lightweight free-text work breadcrumb for the seat. For structured, per-entity, queryable business activity (a client might ask "which ones?"), use rost_record_work instead.SeatCall with summary and evidence.
rost_report_a_signal_readingsignal.reportPropose one draft reading for this seat's own agent-sourced measurable. The reading lands unconfirmed for human review.SeatCall with {"measurable_id":"<id>","value":42,"note":"read off the source","confidence":"high"}.
rost_draft_first_readings_from_a_connected_sourcesignal.draft_first_readingsPull this seat's measurable's connected source ONCE (read-only, SSRF-guarded) and land the value as a DRAFT reading for the current period, for a human to confirm. For a measurable that has a source but no confirmed reading yet. Never publishes and never fabricates a value — a non-numeric or blocked pull drafts nothing.SeatCall with {"measurable_id":"<id>"}.
rost_create_agent_deliverabledeliverable.createCreate a scrubbed durable work output for the acting seat.SeatCall with title, kind, summary/content, and optional safe links.
rost_attach_agent_deliverabledeliverable.attachAttach a scrubbed deliverable to a source run, task, or work order after server-side seat validation.SeatCall with title, kind, and the source ids that belong to the acting seat.
rost_record_workwork.recordAppend structured business-activity records to the seat's append-only work ledger, in a batch, right after each action succeeds. Prefer this over rost_log_work for durable, per-entity, queryable activity (verb + entity ref + outcome + evidence). Secret-redacted; idempotent on dedup_key; corrections are superseding records.SeatCall with {"records":[{"verb":"contacted","object":{"kind":"supplier","external_id":"sup_42","label":"Acme Foods"},"summary":"Emailed Acme for a monk fruit quote.","dedup_key":"gmail:msg-abc"}]}.
rost_list_work_recordswork.listList the seat's work-ledger records newest-first (keyset-paginated), filterable by verb, object kind/ref, outcome, or run.SeatCall with {"verb":"contacted","object_kind":"supplier","limit":50}.
rost_request_a_forge_secret_grantsoftware_factory.secret.requestRequest access to a project secret by key. It creates a durable credential request and approval Task, never accepts a secret value, and does not grant access by itself.SeatCall with {"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY"}.
rost_verify_forge_secret_broker_accesssoftware_factory.secret.useVerify broker authorization for a Forge secret without opening the vault. Missing grants create or reuse a credential request + approval Task; allowed grants return a redacted authorization summary only. Runtime vault use happens runner-side.SeatCall with {"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY","operation":"test_execution"}.
rost_request_a_brokered_secret_grantsecret_grant.requestA seat agent requests a scoped brokered-secret grant (for secret.broker / baserow.*) by naming the host, path prefix, methods, and scope it needs. Draft-and-confirm: no secret and no vault ref. It records a durable blocked-awaiting-grant intervention (blocker_kind vault_credential) that surfaces on the Home "Needs you" band and the blocked seat's page, and returns both an event id and an intervention_id (the human's resolvable handle). A human grants via secret_grant.grant, which closes the intervention.SeatCall with {"seat_id":"<seat-id>","grant_key":"baserow","provider":"baserow","allowed_host":"baserow.example.com","allowed_path_prefix":"/api/database/rows/","allowed_methods":["GET"],"scope_tier":"read"}.
rost_list_brokered_secret_grantssecret_grant.listList the seat's own brokered secret grants. Returns egress allowlist metadata only (host, path prefix, methods, scope, status), never the vault ref or any secret.SeatCall with {} (an agent is server-pinned to its own seat).
rost_record_forge_conformance_findingssoftware_factory.conformance.record_findingsA Forge review seat (plan conformance, security, or QA) records structured findings as reviewer evidence. Set changeset_id on a finding that targets a specific changeset. Open findings route the request back to implementation; accepting a gap remains a separate human gate. Requires the seat's signed manifest grant.SeatCall with {"build_request_id":"<request-id>","findings":[{"severity":"major","category":"scope_gap","summary":"Missing migration verification","changeset_id":"<changeset-id>"}]}.
rost_resolve_forge_conformance_findingsoftware_factory.conformance.resolve_findingA Forge review seat marks a prior open finding resolved after re-reviewing the changeset and verifying it is fixed (reviewer verification, not human gap-acceptance). A resolved finding stops routing the request back to implementation, so the recycle loop converges. Requires the seat's signed manifest grant.SeatCall with {"build_request_id":"<request-id>","finding_ids":["<finding-id>"]}.
rost_decide_a_conversational_gategate.decideA seat agent DRAFTS a conversational gate approval bound to an artifact digest; the call stages a pending confirmation and a human owner/admin CONFIRMS it via /approvals (invariant #7 — an agent drafts, never self-decides). A stale artifact digest (the artifact changed since the gate was drafted) re-blocks and refuses.Seat (draft; owner/admin decides)Call with {"subject_kind":"artifact","subject_id":"<id>","artifact_ref":{"href":"<url>","label":"<label>"},"artifact_digest":"sha256:<digest>","decision":"approve","ask":"Ship it?","consequence":"Unblocks implementation."}; the seat-agent caller receives a confirmation handoff and the owner/admin decides.

When the vision is withheld

A seat-scoped bundle validates the stored document before handing it to you, so one that no longer matches the published contract is never passed off as the live vision. Read the compass_status field (ok / absent / invalid) rather than inferring from a null document — the two are different situations and only the status tells them apart. The full contract, and what to do in each case, is in the compass-authoring-guide under "When the vision is withheld".

MCP operation resources

These read-only resources bundle the facts the UI shows so an agent can avoid guessing ids. Each enforces tenant, role, and seat scope server-side and never returns secrets, tokens, local file paths, or cross-tenant ids. Tenant-wide resources require a tenant-admin token; the seat-context resource is readable by the owning seat token (or a tenant-admin for any seat in the tenant); the operations map is public to any valid token.

ResourcePurposeScopeSafe example
rost://tenant/statusCurrent user, tenant, role/scope, and onboarding status.Tenant-adminRead before driving tenant setup.
rost://graphResponsibility Graph: seats, edges, root, occupants, display-only planned occupants, status rollups.Tenant-adminRead before routing or reparenting work.
rost://seat/{id}/contextA seat's Compass, Charter, goals, measurables, open tasks, open issues, and protocol.Seat (own seat) or tenant-admin (any seat)Read rost://seat/<seat-id>/context for the acting seat.
rost://compass/currentActive and draft Compass versions plus source documents.Tenant-adminRead before drafting Compass changes.
rost://sync/latestThe most recent compiled Sync Brief and its agenda.Tenant-adminRead before running the weekly Sync.
rost://skillsTenant Skills library for tenant-admin tokens; assigned published Skills for seat tokens.Tenant-admin or seatRead before creating, assigning, or loading Skill instructions.
rost://skills/{slug}One Skill descriptor and latest stored version metadata.Tenant-admin or assigned seatRead rost://skills/<slug> before loading the full file.
rost://skills/{slug}/files/{path}Stored Skill package file content by package path; never server filesystem paths.Tenant-admin or assigned seatRead rost://skills/<slug>/files/SKILL.md.
rost://agents/templatesStock agent templates: responsibilities, default tools, safety boundaries, and dry-run rehearsal.Tenant-adminRead before creating an agent from a template.
rost://agent-setup/{id}A draft agent setup's mode, parent, steward, lane, schedule, tool decisions, dry-run, blockers, and next action.Tenant-adminRead rost://agent-setup/<setup-id> to resume a draft.
rost://seat/{id}/agent-statusA seat's agent occupancy, lane, schedule, live state, steward chain, and dry-run result.Seat (own seat) or tenant-admin (any seat)Read rost://seat/<seat-id>/agent-status for the acting seat.
rost://seat/{id}/skillsApproved Skill assignments for a Seat, including immutable version and dependency status.Seat (own seat) or tenant-admin (any seat)Read rost://seat/<seat-id>/skills before a run loads Skills.
rost://operations/reference-mapMachine-facing map of which guide to read before each workflow.Any valid MCP tokenRead first when planning a CLI/MCP workflow.

Troubleshooting

These rows are quick, at-a-glance triage. For deeper auth, tenant, scope, confirmation, and MCP-token errors — including structured error-code interpretation — see the troubleshooting-guide.

  • Not logged in: run rost login, then retry rost whoami.
  • Session not persisting (keychain issue — "not logged in" right after a successful login): clear and re-run rost login --device; the session is stored in the macOS Keychain by default. On a non-macOS or no-keychain host the CLI errors unless you opt into the plain-file token store — see Headless Linux, CI, and machines with no keychain.
  • Wrong tenant: run rost tenants, then rost use <tenant-slug-or-id>.
  • Missing Node: install Node 22 or newer, then rerun npx @rosthq/cli@latest --help.
  • Node present but too old (npx launches but the CLI rejects it): run node --version; if it is below v22, upgrade Node.
  • Stale npx cache: rerun with npx @rosthq/cli@latest --help or clear the npm cache.
  • MCP connection not working after registering: call rost_list_commands with {} (any token); with a tenant-admin token read rost://tenant/status, with a seat-scoped token call rost_get_context with {} (a seat token cannot read rost://tenant/status). A 401 / not-authorized shape means the token did not register — re-run mcp install.
  • Revoked, expired, or invalid MCP token: run rost mcp install --client <client> --scope <tenant-admin|seat> again to mint and register a fresh one (a direct install requires --scope; or rotate the old token in place with --rotate <old-token-id>, which inherits its scope). Tokens minted by mcp install default to a 90-day expiry — check expires_in_days in rost command mcp_token.list; mint with --expires-in <days> or --no-expiry to change it.
  • Confirmation required: a human approves from the approveVia web link or runs the rost command confirmation.approve --json ... command shown in the CLI error output (an agent never approves its own request — see the confirmations-guide).
  • Command denied by scope or manifest: switch to a tenant-admin token for setup, or ask a human Steward to update the seat Charter and permission manifest.
  • Inference budget hard cap reached (a run stops with a budget precondition error): raise the tenant hard cap with rost settings update --hard-cap-usd <amount> (command settings.update), then retry. A new company starts at a $0 hard cap, so managed-inference runs are blocked until it is set. The sandbox dry run is free and is never blocked by the cap, so you can charter, dry-run, and go live before setting a budget.
  • Need command guidance: run rost docs, rost reference search "onboarding", or rost reference get agent-reference-map.
  • Need MCP guidance: call rost_reference_get with {"slug":"agent-reference-map"}.

Version

2026-08-06.3

Used by

  • human
  • cli
  • mcp
  • in app agent

API

/api/reference/files/mcp-and-cli-guide