CLI and MCP installation guide
Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.
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 browserThis 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-codeThis 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 abandonedTo 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 cursorThis 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 stagedagent.run_nowawaits approval; every otherrunner.*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_completeis 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_flowcommands (agent.configure_tools,credential.ingress,integration.connect_rest, andtenant.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, andcoach.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 inpackages/commands/src/implementation-bootstrap-policy.tsand 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 — anyroleother than absent or"informs"falls to a human) andgoal.set_auto_status(onlyenabled: 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 --deviceprints 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_idand anapproveViaURL for a human and stops. When a logged-in human runsrost command <id>orrost mcp installfrom an interactive TTY, the official CLI renders the complete gate and asksApprove <command-id> (confirmation <id>)? [y/N]; only an explicityoryescallsconfirmation.approvewithreviewed: trueand 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, androst command <id> --jsonall 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/deviceand/mcpURLs in its output; copy them from the terminal rather than guessing the host.<tenant-slug-or-id>— a tenant identifier fromrost tenants.<seat-id>— a seat id fromrost command seat.createoutput orrost_get_responsibility_graph/rost command graph.get.<token-id>— an MCP token id printed bymcp install, or discoverable later viarost 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, sorost onboard statusand 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 activetenant.create.additionalentitlement. 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 loginOr install it globally:
npm i -g @rosthq/cli
rost loginThe 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 --versionIf 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 --deviceHow 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 --deviceif 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 statusIt 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 --deviceFor 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 codexMCP 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-adminCodex (tenant-admin):
npx @rosthq/cli@latest mcp install --client codex --scope tenant-adminCursor (tenant-admin):
npx @rosthq/cli@latest mcp install --client cursor --scope tenant-adminThe 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 explicityoryesrecordsreviewed: 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 exactrost command confirmation.approve --json '{"confirmation_id":"<id>"}'command, and theapproveViaURL 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-runmcp installafter approving: that starts a second mint and orphans the first token. The retired--skip-permissionsflag is rejected, andROST_CLI_SKIP_PERMISSIONSis 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 addcommand — 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 logoutdoes 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_commandswith{}. - Tenant-admin token: read the resource
rost://tenant/status. - Seat-scoped token: call
rost_get_contextwith{}(or readrost://seat/<seat-id>/context). A seat token cannot readrost://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-inand 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
| Command | Purpose | Scope | Safe example |
|---|---|---|---|
rost login | Open browser login and store the CLI session. | User session | rost login |
rost login --device | Device-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 session | rost 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 logout | Clear the local CLI session. | Local session | rost 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 entitlement | rost tenant create --company "Acme East" |
rost whoami | Show the authenticated user, accessible tenant roles, and the active tenant (current_tenant_id). | User | rost whoami |
rost tenants | List tenants the user can access; the active one is marked current. | User | rost 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. | User | rost use acme-ops |
Reference and docs
| Command | Purpose | Scope | Safe example |
|---|---|---|---|
rost docs | Print the agent-facing how-to summary. | Public reference | rost docs |
rost doctor | Diagnose local CLI configuration: app URL, Supabase URL, installed version, PATH, session store, local Claude/Codex availability, and update status without printing tokens. | Local environment | rost doctor |
rost help [group] | Print top-level usage, or one operation group's usage; rost <group> --help works too. | Public reference | rost 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 reference | rost reference search "onboarding" --audience cli |
rost reference list | List public reference guides. | Public reference | rost reference list --audience cli |
rost reference search <query> | Search public guides. | Public reference | rost reference search "MCP install" --audience mcp |
rost reference get <slug> | Print one public guide. | Public reference | rost 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.
| Command | Purpose | Scope | Safe example |
|---|---|---|---|
rost onboard preflight | Print 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 status | Return onboarding progress, graph summary, and next actions. | Tenant | rost onboard status |
rost onboard resume | Resume the guided onboarding flow where it left off. | Tenant | rost onboard resume |
rost onboard run | Print the deterministic agent onboarding prompt. | Public reference | rost onboard run |
rost onboard source-ingest | Retain 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 setup | Stage 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-status | Discover 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 rehearse | Run 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 activate | Stage 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 tenant | rost init --client codex |
rost init --tenant <tenant> --client <client> | Select a tenant before MCP install. | User plus tenant | rost 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]| Command | Purpose | Scope | Safe 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 status | Show the bootstrap run state and whether the implementation credential is still valid. | Implementation bootstrap | rost implementation access status |
rost implementation access complete | Close the bootstrap run as completed. This revokes the implementation credential. | Implementation bootstrap | rost implementation access complete |
rost implementation access abandon | Close the bootstrap run as abandoned. This revokes the implementation credential. | Implementation bootstrap | rost 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 bootstrap | rost implementation access install-mcp --client codex |
Direct command execution
| Command | Purpose | Scope | Safe 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-defined | rost 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-scoped | rost 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-scoped | rost command list |
rost command onboarding.attach_reference --json ... | Attach a company reference document (reference-only). | Tenant | rost 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. | Tenant | rost 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 bootstrap | rost command schema seat.create_complete --json |
rost command charter.draft --json ... | Create or fetch a draft Charter. | Seat or tenant-admin | rost command charter.draft --json '{"seat_id":"<seat-id>"}' |
rost command confirmation.approve --json ... | Approve a pending confirmation as a human. | Tenant | rost 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.
| Command | Command ids | Purpose | Scope | Safe example |
|---|---|---|---|---|
rost task list|accept|decline|complete|create | task.list, task.accept, task.decline, task.complete, task.create, task.confirm_proposal, task.decline_proposal | Operate a seat's task queue and target-side proposal decisions. | Seat / tenant | rost task list --json; rost command task.confirm_proposal --json '{"id":"<task-id>"}' |
rost status record | status.record | Record measurable readings and goal status as a status event. | Seat | rost status record --measurable-id <id> --value 42 |
rost signal list|get|confirm|correct | signal.list, signal.get, signal.confirm_reading, signal.correct_reading | Read and confirm Signal measurables. | Seat | rost signal list --json |
rost goal list|create|update|status|reparent|reassign-owner|drop | goal.list, goal.create, goal.update, goal.set_status, goal.reparent, goal.reassign_owner, goal.drop | Manage 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-admin | rost goal list --json |
rost friction list|file|resolve|link | friction.list, friction.file_issue, friction.resolve, friction.link_task | File and resolve Friction issues. | Seat | rost friction list --status open --json |
rost escalation list|get|resolve|reject | escalation.list, escalation.get, escalation.resolve, escalation.reject | Work the steward escalation queue. | Steward | rost escalation list --json |
rost error list|resolve|supersede | error_log.list, error_log.resolve, error_log.supersede | List active, acknowledged, resolved, or superseded product error logs and let a human acknowledge, resolve, or supersede stale errors with evidence links. | Tenant | rost error list --resolved active --json; rost error resolve --error-log-id <id> --reason "Fixed in PR #123" |
rost sync brief|compile|complete | sync.brief.get, sync.brief.compile, sync.run.complete | Compile, read, and complete a weekly Sync. | Tenant | rost sync brief --json |
rost runner list|status|diagnose|repair|work-orders|revoke|serve|login | runner.list, runner.status, runner.diagnose, runner.repair, work_order.list, runner.revoke, runner endpoint APIs | Inspect 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. | Tenant | rost 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 serve | Install 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|errors | notification.settings.get, notification.test, notification.list_errors | Read notification settings, send a test, and list failed deliveries with linked product error source, seat id, and run id when available. | Tenant | rost notification errors --limit 10 --json |
rost integration list|readiness|status|test / credential flow for Baserow REST connect | integration.connect_rest, integration.list, integration.readiness, integration.status, integration.test | Create 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/tests | rost integration readiness --provider google --json |
rost system health | system.health | Read 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 token | rost system health --json; rost system health --seat <id> --json |
rost command usage.report|usage.snapshot | usage.report, usage.snapshot | Read 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). | Tenant | rost command usage.report --json; rost command usage.snapshot --json |
rost settings get|update|product-learning|agent-policy|confirmation-mode|rename | settings.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.rename | Read 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 updates | rost 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.update | tenant.model_gateway_policy.update | Unlock 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-admin | rost command tenant.model_gateway_policy.update --json '{"allow_non_zdr_models":true}' |
rost member invite|update|remove | member.invite, member.update, member.remove | Manage tenant members; execution requires an owner or admin membership. | Tenant | rost 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|show | agent_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_markdown | Run 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 seat | rost 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.supersede | Build 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 write | rost 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 list | tool.catalog | List 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). | Tenant | rost tools list --json |
rost skills list|get|file|assigned|check-dependencies | skill.list, skill.get, skill.file.get, skill.assigned.list, skill.check_dependencies | Discover 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 Skills | rost skills list --json; rost skills file --slug invoice-review --path SKILL.md |
rost skills catalog|enable|install|sync | skill.catalog, skill.enable_catalog, skill.install_local, skill.sync_local | Discover 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 Skills | rost 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|revoke | skill.create, skill.update_draft, skill.import_github, skill.import_upload, skill.publish, skill.assign_to_seat, skill.revoke_from_seat | Create 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 requests | rost 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 list | model.catalog | List guided model tiers with recommendations, token prices, cost bands, best-fit work, and model ids for --model. | Tenant | rost model list --json |
rost compass show | compass.show_markdown | Render the current Compass as a clean markdown card for review. | Tenant | rost compass show --markdown |
rost charter show | charter.show_markdown | Render a seat's Charter as a clean markdown card for review. | Tenant | rost charter show --seat-id <id> --markdown |
rost deliverable list|get|create|attach | deliverable.list, deliverable.get, deliverable.create, deliverable.attach | List, 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 show | graph.get | Print a table view of the Responsibility Graph with explicit seat_id and parent_seat_id columns. | Tenant | rost graph show |
rost seat list|get|create|create-complete|rename|reparent|decommission | graph.get, seat.get, seat.create, seat.create_complete, seat.rename, seat.reparent, seat.decommission, seat.decommission_preview | Work 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 mutations | rost 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-resume | software_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.resume | Create/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 controls | rost 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
| Command | Purpose | Scope | Safe 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. | Tenant | rost 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. | Tenant | rost mcp install --client codex --rotate <old-token-id> |
rost mcp install --client claude-code --scope tenant-admin | Mint a tenant-admin MCP token and print a Claude Code registration command. | Tenant | rost mcp install --client claude-code --scope tenant-admin |
rost mcp install --client codex --scope tenant-admin | Mint a tenant-admin MCP token and print Codex TOML. | Tenant | rost mcp install --client codex --scope tenant-admin |
rost mcp install --client cursor --scope tenant-admin | Mint a tenant-admin MCP token and print Cursor JSON. | Tenant | rost 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). | Seat | rost mcp install --client codex --scope seat --seat-id <seat-id> |
rost --help | Print top-level CLI help. | Public help | rost --help |
rost --version / rost -v | Print the installed CLI's own version and exit — no usage text, no auth. | Public help | rost --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.
| Tool | Purpose | Scope | Safe example |
|---|---|---|---|
rost_describe_command | Return 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 token | Query {"command_id":"compass.draft"} |
rost_list_commands | List 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 token | Query {"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 resource | Purpose | Scope | Safe example |
|---|---|---|---|
rost_reference_search | Search public reference guides. | Any valid MCP token | Query {"query":"agent-reference-map","audience":"mcp"} |
rost_reference_get | Retrieve 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 token | Query {"slug":"agent-reference-map","section":"mcp-surfaces"} |
rost://reference/{slug} | Read a public reference guide as a resource. | Any valid MCP token | Resource 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.
| Tool | Command id | Purpose | Required scope | Safe example |
|---|---|---|---|---|
rost_onboard_status | onboarding.status | Inspect onboarding progress. | Tenant | Call with {} |
rost_advance_onboarding_step | onboarding.advance_step | Persist the current onboarding step after validation. | Tenant | Call with the next step after checking status. |
rost_finish_onboarding | onboarding.finish | Write the durable onboarding completion marker. It is written unconditionally; onboarding.status honours it only once every derived requirement passes. | Tenant | Call 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_source | onboarding.source_ingest | Retain one bounded encrypted onboarding source for the current implementation run or direct owner setup. | Tenant | Call with one source and its declared kind; use the returned logical source key in setup. |
rost_apply_onboarding_setup | onboarding.setup | Stage one atomic company setup proposal for owner review without making agents live. | Tenant | Submit the complete normalized plan; expect one human confirmation. |
rost_rehearse_onboarding_agents | onboarding.rehearse | Run 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. | Tenant | Inspect 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_agents | onboarding.activate | Stage one complete owner approval for the setup receipt's exact all-passed agent set; approval activates the group and completes onboarding atomically. | Tenant | Pass the terminal batch receipt id plus every per-agent rehearsal run and configuration digest returned by onboarding.rehearse; expect one approval URL. |
rost_onboard_resume | onboarding.resume | Return the machine-readable onboarding resume state (path choice, pending setup, next step). | Tenant | Call with {}. |
rost_attach_reference_document | onboarding.attach_reference | Attach a company reference document (text/markdown) with title/kind/source so Compass and Charters can cite it. | Tenant | Call with text, a title, a kind, and a source. |
rost_upload_org_context | onboarding.upload_context | Back-compat alias of onboarding.attach_reference. | Tenant | Prefer rost_attach_reference_document; same widened schema. |
rost_create_onboarding_invite | onboarding.create_invite | Owner/admin human-gated ordinary invite during onboarding; cohort beta-tester/design-partner flags are server-only. | Tenant | Call with a business email, role, and strict ordinary invite flags. |
rost_save_tenant_anthropic_key | tenant.anthropic_key.save | Store a tenant model key through the vault. | Tenant | Use only with a real human-provided secret. |
rost_disable_tenant_anthropic_key | tenant.anthropic_key.disable | Revoke the active tenant Anthropic BYOK credential after managed fallback is available. | Tenant-admin | Human-gated; call with {}. The old key value is never returned. |
rost_create_seat | seat.create | Create a Responsibility Graph seat. | Tenant | Call with {"name":"Finance","seat_type":"human"}. |
rost_create_complete_seat | seat.create_complete | Stage one complete Seat, canonical Charter, disclosed staffing, and optional dry-run agent configuration as one atomic owner-confirmed proposal. | Tenant | Read the schema first; direct calls use existing parent and Steward Seat ids. The command never makes an agent live. |
rost_rename_seat | seat.rename | Rename a seat. | Seat or tenant-admin | Call with seat_id and name. |
rost_reparent_seat | seat.reparent | Move a seat under a new parent. | Seat or tenant-admin | Call with seat_id and parent_seat_id. |
rost_set_seat_type | seat.set_type | Set a seat type. | Seat or tenant-admin | Call with seat_id and seat_type. |
rost_preview_seat_decommission | seat.decommission_preview | Preview retiring a seat: affected occupancies, agents, Charters, MCP tokens, credentials, work orders, and schedules. No mutation. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}; no confirmation. |
rost_decommission_seat | seat.decommission | Retire a seat: end occupancies, archive the Charter, revoke tokens/credentials, cancel schedules, tombstone event. No-orphan guarded. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}; expect confirmation. |
rost_draft_charter | charter.draft | Create or fetch a draft Charter. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}. |
rost_draft_all_charters | charter.draft_all | Draft 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). | Tenant | Call after initial graph creation. |
rost_update_charter_draft | charter.update_draft | Update a draft Charter document. | Seat or tenant-admin | Call with charter_version_id and the full doc. |
rost_set_charter | charter.set | Create or replace a seat's draft Charter from a full document in one call. | Seat or tenant-admin | Call with seat_id and doc; approve activates it (human gate). |
rost_approve_charter | charter.approve | Approve a draft Charter as a human owner. | Seat or tenant-admin | Expect confirmation when authority changes. |
rost_preview_charter_signal_reconciliation | charter.preview_signal_reconciliation | Owner-only dry run of how a draft Charter's declared Signals resolve against the Signals the company already tracks. | Tenant-admin | Call with charter_version_id; reads only, and returns the edit_revision to reconcile with. |
rost_reconcile_charter_signals | charter.reconcile_signals | Owner-only Charter approval carrying an explicit adopt / move / create decision per colliding Signal declaration. | Tenant-admin | Preview first; pass its edit_revision and one resolution per colliding, unlinked declaration. |
rost_skip_charter_draft | charter.skip | Mark a Charter draft as skipped. | Seat or tenant-admin | Call only when a human defers the seat. |
rost_apply_charter_seat_type_recommendation | charter.apply_seat_type_recommendation | Apply a Charter's seat-type recommendation. | Seat or tenant-admin | Call after reviewing the draft. |
rost_sign_charter_manifest | charter.sign_manifest | Request human confirmation for a permission manifest. | Seat or tenant-admin | Use after tool permissions are reviewed. |
rost_list_pending_confirmations | confirmation.list | List 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-admin | Call with {}. |
rost_list_activation_approval_sets | confirmation.activation_set.list | List agent-authored activation confirmation sets grouped by implementation run for human review. | Tenant | Call with {}. |
rost_draft_compass | compass.draft | Create a Compass draft. | Tenant | Call with a concise Compass document. |
rost_update_compass_draft | compass.update_draft | Replace a Compass draft document. | Tenant | Call with the compass_version_id from compass.draft as draft_id and the updated document. |
rost_approve_compass_version | compass.approve_version | Activate a Compass version by supersession. | Tenant | Call after human review. |
rost_reject_compass_draft | compass.reject_draft | Reject and remove a Compass draft. | Tenant | Call when the draft should not proceed. |
rost_answer_compass_gap | compass.answer_gap | Record a human answer for a Compass gap. | Tenant | Call with gap_id and answer text. |
rost_set_compass | compass.set | Compatibility helper for setting Compass over MCP. | Tenant | Call with the approved Compass shape. |
rost_assign_user_to_seat | staffing.assign_user | Assign a human user occupancy to a seat. | Seat or tenant-admin | Call with seat_id and user_id. |
rost_assign_dry_run_agent_to_seat | staffing.assign_agent_dry_run | Assign an agent occupancy in dry-run mode. | Seat or tenant-admin | Call only after Steward chain is clear. |
rost_staff_seat | staffing.assign | Compatibility helper for human, agent, or hybrid staffing. | Seat or tenant-admin | Call with seat_id and occupant. |
rost_import_agent_definition | agent.import_definition | Import a strict, versioned agent definition into a canonical draft Seat/setup without credentials, placement ids, or go-live side effects. | Tenant | Human-gated; call with definition_json and optional idempotency_key. Review the resulting draft setup before tools, dry run, or go-live. |
rost_go_live | agent.go_live | Promote a dry-run agent seat to live, retiring the agent generation the promoted agent replaces on that seat. | Seat or tenant-admin | Call after human approval. Paused agents, and an agent pinned to another still-draft Charter version, are left in place. |
rost_create_mcp_token | mcp_token.create | Mint a tenant-admin or seat-scoped MCP token. | Tenant | Prefer rost mcp install for users. |
rost_revoke_mcp_token | mcp_token.revoke | Revoke an MCP token immediately. | Tenant | Call with token_id. |
rost_get_responsibility_graph | graph.get | Read the Responsibility Graph: seats, edges, root, occupants, display-only planned occupants, status rollups. | Tenant | Call with {} before mutating or routing work. |
rost_get_seat_detail | seat.get | Read a seat's Charter ids, steward chain, occupancy, display-only planned occupants, agent status, token metadata, and open-work counts. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}. |
rost_list_charters | charter.list | List Charter versions, optionally by seat or status. | Tenant | Call with {} or {"seat_id":"<seat-id>"}. |
rost_get_charter | charter.get | Read a Charter with supersession history and dry-run status. | Tenant | Call with {"charter_version_id":"<id>"}. |
rost_get_current_compass | compass.get_current | Read the active and draft Compass versions and source documents. | Tenant | Call with {}. |
rost_list_compass_gaps | compass.list_gaps | List unanswered and answered Compass context gaps. | Tenant | Call with {} before answering gaps. |
rost_get_agent_status | agent.status | Read agent lane, live state, steward chain, dry-run result, Runner availability. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}. |
rost_list_agent_fleet | agent.list_fleet | Read 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. | Tenant | Call 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_digest | agent.fleet_digest | Capture the daily dogfood fleet-health digest: live/idle state, 24h/7d turns, spend, recent failed runs, unresolved errors, failed notifications, and next actions. | Tenant | Call with {}; optional window_hours bounds recent failed-run evidence, while error_limit caps linked evidence per seat. |
rost_system_health | system.health | Read 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 token | Call with {}; optional seat_id narrows inside the caller's server-derived scope. |
rost_get_run_heartbeats | agent.run_heartbeats | Read 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. | Tenant | Call with {}; optional seat_ids narrows to specific seats. |
rost_run_agent_now | agent.run_now | Queue 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. | Tenant | A 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_runs | agent.list_runs | Read 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-admin | Call with {"seat_id":"<seat-id>"}; pass limit for a deeper window. |
rost_get_agent_run_diagnostics | agent.get_run | Read 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-admin | Call with {"seat_id":"<seat-id>","run_id":"<run-id>"}. |
rost_list_agent_tool_calls | agent.list_tool_calls | Read 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-admin | Call with {"seat_id":"<seat-id>"}; pass held_only: true for only guard-held calls. |
rost_watch_agent_run | agent.watch_run | Read 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-admin | Call with {"seat_id":"<seat-id>","run_id":"<run-id>"}; read-only and reflects the run's current live state. |
rost_list_agent_deliverables | deliverable.list | List durable agent deliverables for a seat, including explicit outputs and successful-run summaries. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>"}. |
rost_get_agent_deliverable | deliverable.get | Read one durable agent deliverable by id for a seat. | Seat or tenant-admin | Call with {"seat_id":"<seat-id>","deliverable_id":"<id>"}. |
rost_accept_deliverable_value | deliverable.accept | Record 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-admin | Call with {"deliverable_id":"<id>","impact_value_usd":<number>}; expect human confirmation. |
rost_reject_deliverable_value | deliverable.reject | Record 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-admin | Call with {"deliverable_id":"<id>","reason":"<why>"}; expect human confirmation. |
rost_ai_workforce_roi_report | usage.report | Read the AI-workforce ROI report — per-period agent turns, token/run cost, human-accepted value, exceptions, and approvals — from immutable usage snapshots. | Tenant | Call with {} or {"limit":<n>}. |
rost_capture_usage_period_snapshot | usage.snapshot | Freeze the current (or a given) period's usage and accepted-value totals into an immutable snapshot; insert-only and idempotent. | Tenant | Call with {} or {"period":"YYYY-MM-DD"}. |
rost_list_agent_templates | agent_template.list | List stock agent templates and metadata. | Tenant | Call with {}. |
rost_create_agent_from_template | agent.create_from_template | Create a draft stock agent and draft Charter from a template (draft-only; occupancy needs a human steward). | Tenant | Call with seat_id and template_slug; expect human confirmation. |
rost_start_agent_setup | agent_setup.start | Start an agent setup draft for template, custom, or existing mode. | Tenant | Call with mode and seat placement. |
rost_get_agent_setup | agent_setup.get | Read agent setup state, blockers, and next action. | Seat or tenant-admin | Call with {"setup_id":"<id>"}. |
rost_update_agent_setup | agent_setup.update | Update parent, steward, lane, schedule, answers, or skill discovery on a setup draft. | Tenant | Call with setup_id and the fields to change. |
rost_update_agent_schedule | agent.update_schedule | Update a draft or live agent's scheduled execution. | Tenant | Call 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_agent | agent.decommission | Retire an agent occupancy safely (no-orphan guarded). | Tenant | Call with agent_id; expect human confirmation. |
rost_pause_agent | agent.pause | Pause a live agent so it stops scheduled and on-demand runs; reversible. | Tenant | Call with seat_id; expect human confirmation. |
rost_resume_agent | agent.resume | Resume a paused agent back to live (no-orphan guarded). | Tenant | Call with seat_id; expect human confirmation. |
rost_re_lane_a_live_agent | agent_setup.relane | Re-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-admin | Call with {"seat_id":"<seat-id>","lane":"runner","reason":"Paired a Mac runner"}; expect human confirmation. |
rost_create_custom_agent | agent.create_custom | Create a draft custom agent shell and draft Charter seed from operational answers. | Tenant | Call with seat_id and operational answers; expect human confirmation. |
rost_configure_agent_tools | agent.configure_tools | Connect or decline proposed tools and stage credential-ingress requests (vault refs only). | Seat or tenant-admin | Never send raw secrets; expect a credential confirmation. |
rost_run_agent_dry_run | agent.run_dry_run | Run the sandbox dry run for a draft agent; durable and idempotent per Charter version. | Seat or tenant-admin | Call after the manifest is signed; ungated by human approval, but precondition-gated on a signed manifest. |
rost_list_mcp_tokens | mcp_token.list | List MCP token metadata (never token material). | Tenant | Call with {} or {"include_revoked":true}. |
rost_list_runners | runner.list | List local runners with heartbeat health, execution readiness, queue counts, and recent result evidence. | Tenant | Call with {}. |
rost_runner_status | runner.status | Read a single runner's capability, heartbeat health, and execute-readiness state. | Tenant | Call with runner_id. |
rost_diagnose_runner | runner.diagnose | Return runner health, claimability checks, capabilities, and repair guidance without secrets. | Tenant | Call with runner_id; claimability exposes safe predicates, required vs actual values, pass/fail state, and remediation for claimable work. |
rost_runner_repair_guidance | runner.repair | Return focused repair steps for a runner: restart, re-pair, revoke stale, or install missing CLI runtime. | Tenant | Call with runner_id and optional issue (restart, re_pair, revoke_stale, missing_cli_runtime). |
rost_start_runner_pairing | runner.pairing.start | Open a runner pairing session and return the human pairing code. | Tenant-admin | Call with name and platform; owner/admin only. |
rost_list_pending_device_pairings | device.pairing.list | List 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-admin | Call with {}; owner/admin only. |
rost_revoke_runner | runner.revoke | Revoke a runner so it can no longer authenticate. | Tenant | Call with runner_id; expect human confirmation. |
rost_list_work_orders | work_order.list | List runner/cloud work orders for the tenant. | Tenant | Call with optional status, agent_id, or runner_id. |
rost_enqueue_work_order | work_order.enqueue | Queue a work order for a live scheduled agent. | Tenant | Call with agent_id. |
rost_cancel_work_order | work_order.cancel | Cancel a queued, claimed, or running work order. | Tenant | Call with work_order_id; expect human confirmation. |
rost_get_notification_settings | notification.settings.get | Read tenant notification preferences. | Tenant | Call with {}. |
rost_update_notification_settings | notification.settings.update | Update tenant notification preferences. | Tenant | Call with the fields to change. |
rost_send_test_notification | notification.test | Emit an in-app test notification to the acting human. | Tenant | Call with {}. |
rost_list_notification_errors | notification.list_errors | List recent failed notification deliveries with linked error_log_id, source, seat id, and run id when available. | Tenant | Call with optional limit; source=run rows can be followed with agent.get_run. |
rost_list_error_logs | error_log.list | List product error logs by seat, source, severity, and active/resolved state. | Tenant | Call with {"resolved":"active"} before acknowledging stale failures. |
rost_resolve_error_log | error_log.resolve | Acknowledge or resolve an error log with a required human reason and optional task, issue, or PR link. | Tenant | Call with error_log_id, reason, and disposition acknowledged or resolved. |
rost_supersede_error_log | error_log.supersede | Mark an older error log as superseded by a newer in-tenant error log. | Tenant | Call with error_log_id, new_error_log_id, and reason. |
rost_find_stale_error_logs | error_log.stale_candidates | List 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. | Tenant | Call with optional stale_after_days and limit; feed the returned ids to error_log.bulk_resolve. |
rost_bulk_resolve_error_logs | error_log.bulk_resolve | Acknowledge 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. | Tenant | Human decision; expect confirmation. Call with error_log_ids, reason, and disposition. |
rost_list_integrations | integration.list | List connected integration metadata and latest health state. | Tenant | Call with {} or {"provider":"google"}; no secrets or vault refs are returned. |
rost_check_integration_readiness | integration.readiness | Return the connector setup checklist: OAuth env/callback, tenant connection, scopes, latest test state, external verification/CASA, handler availability, and DER-coded next actions. | Tenant | Call with {"provider":"google"}; metadata only, no secrets or vault refs. |
rost_get_integration_status | integration.status | Read one integration's metadata by provider or integration id. | Tenant | Call with {"provider":"google"} or {"integration_id":"<id>"}. |
rost_test_integration_connection | integration.test | Run the provider-specific connection test and update integration health. | Tenant | Call with {"provider":"google"}; result is bounded metadata only. |
rost_invite_member | member.invite | Create a pending tenant invite for a human teammate. | Tenant | Owner/admin only; call with email and role. |
rost_update_member_role | member.update | Change a tenant member's role. | Tenant | Owner/admin only; call with member_id and role; expect human confirmation. |
rost_remove_member | member.remove | Remove a tenant member. | Tenant | Owner/admin only; call with member_id; blocked if it would orphan an agent steward chain. |
rost_get_tenant_settings | settings.get | Read tenant operating settings and integration status. | Tenant | Call with {}; metadata only. |
rost_update_tenant_settings | settings.update | Update tenant AI budget caps. | Tenant | Call with soft_cap_usd or hard_cap_usd; expect human confirmation. |
rost_rename_company | tenant.rename | Rename the current company. | Tenant-admin | Call with company_name; expect human confirmation. |
rost_get_sync_brief_scope | settings.sync_brief_scope.get | Read the tenant's Sync Brief scope (company_wide or per_cluster). | Tenant | Call with {}. |
rost_update_sync_brief_scope | settings.sync_brief_scope.update | Set the tenant's Sync Brief scope (company_wide or per_cluster). | Tenant-admin | Owner-only; call with {"sync_brief_scope":"company_wide"} or {"sync_brief_scope":"per_cluster"}. |
rost_get_member_visibility_mode | settings.member_visibility.get | Read the tenant's member visibility mode (all or seat_subtree). | Tenant | Call with {}. |
rost_update_member_visibility_mode | settings.member_visibility.update | Set the tenant's member visibility mode (all or seat_subtree). | Tenant-admin | Owner-only; call with {"member_visibility_mode":"all"} or {"member_visibility_mode":"seat_subtree"}. |
rost_get_product_learning_policy | settings.product_learning.get | Read whether product/page/recommendation analytics are allowed. | Tenant | Call with {}; audit/security logs are always enabled. |
rost_update_product_learning_policy | settings.product_learning.update | Set product-learning mode. | Tenant-admin | Human-gated; call with {"mode":"enabled"}, {"mode":"disabled"}, or {"mode":"enterprise_contract"}. |
rost_get_company_autonomy_ceiling | settings.agent_policy.get | Read the company autonomy ceiling (Company Guardrails): profile, enforcement, and max_autonomous_risk. | Tenant | Call with {}; metadata only. |
rost_set_company_autonomy_ceiling | settings.agent_policy.update | Set the company autonomy ceiling. | Tenant-admin | Owner-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_mode | settings.confirmation_policy.get | Read the CLI confirmation mode: careful (the strict default — the CLI cannot silently auto-approve a pending confirmation) or trusted_operator (an owner opt-in). | Tenant | Call with {}; metadata only. |
rost_set_cli_confirmation_mode | settings.confirmation_policy.update | Set the CLI confirmation mode. | Tenant-admin | Owner-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_policy | settings.tool_policy.get | Read tenant capability-grant defaults and the AICOS auto-trust posture. | Tenant | Call with {}; metadata only. |
rost_update_tenant_tool_policy | settings.tool_policy.update | Update tenant capability-grant defaults and the AICOS auto-trust posture. | Tenant-admin | Owner/admin only and human-gated; call with {"mode":"managed","aicos":{"trust_new_capabilities_automatically":true}}. |
rost_update_model_gateway_policy | tenant.model_gateway_policy.update | Unlock or relock managed models that lack a zero-retention (ZDR) tier. | Tenant-admin | Owner-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_settings | aicos.brain_settings.get | Read AICOS lane and brain labels for cloud managed/BYOK, runner Claude/Codex, and MCP client. | Tenant | Call with {}; returns enum labels only, never keys, vault refs, or runner secrets. |
rost_update_aicos_brain_settings | aicos.brain_settings.update | Update AICOS lane and cloud/runner brain preferences. | Tenant-admin | Owner-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_signals | signal.list | List measurables with their latest reading, on/off-track state, and effective_source (read-time measured-by). | Seat or tenant-admin | Call with {} to find measurable ids. |
rost_get_signal | signal.get | Read a measurable with its full reading history. | Seat or tenant-admin | Call with {"measurable_id":"<id>"}. |
rost_confirm_signal_reading | signal.confirm_reading | Confirm an unconfirmed reading as human-verified. | Seat or tenant-admin | Humans confirm; call with {"reading_id":"<id>"}. |
rost_correct_signal_reading | signal.correct_reading | Overwrite a reading with a human-confirmed value. | Seat or tenant-admin | Manual correction; expect confirmation. |
rost_add_a_measurable | measurable.create | Add a measurable a seat owns (name, unit, direction, target, cadence). | Seat or tenant-admin | Call with {"seat_id":"<id>","name":"...","unit":"...","direction":"up_good","target":0,"cadence":"weekly"}. |
rost_import_signals_from_csv | signal.import | Bulk-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-admin | Owner-only (DER-2030); call with the parsed measurables array. |
rost_list_measurable_templates | measurable_template.list | List the measurable template catalog (Sales/Finance/Ops/Marketing/HR) with unit, direction, cadence, and a suggested target. | Seat or tenant-admin | Call with {} or {"function":"sales"}. |
rost_adopt_a_measurable_template | measurable_template.adopt | Create 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-admin | Call with {"template_id":"sales.new_qualified_leads","seat_id":"<id>"}. |
rost_read_the_scorecard_grid | scorecard.grid | Read 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-admin | Call with {} or {"cadence":"monthly","trailing":6}. |
rost_discover_a_connection_for_signals | integration.discover | Read-only introspection of a connected source: returns non-secret metadata and a recipe skeleton to author a signal pull against. | Tenant-admin | Owner-only (DER-2030); no network; call with {"integration_id":"<id>"}. |
rost_preview_a_signal_source | signal.preview | Run 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. | Tenant | Call with {"measurable_id":"<id>","integration_id":"<id>","recipe":{...}}. |
rost_bind_a_signal_source_draft | signal.bind | Persist 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-admin | Owner-only (DER-2030); call with {"measurable_id":"<id>","integration_id":"<id>","recipe":{...},"cadence":"weekly","preview_token":"<token>"}. |
rost_confirm_and_activate_a_signal_binding | signal.bind_confirm | Human-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-admin | Owner-only (DER-2030); human confirms; call with {"binding_id":"<id>"}. |
rost_import_friction_issues_from_a_ninety_issues_list | friction.import | Bulk-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. | Tenant | Call with the parsed issues array. |
rost_import_tasks_from_a_ninety_to_dos_export | task.import | Bulk-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. | Tenant | Call with the parsed todos array. |
rost_import_rocks_from_a_ninety_rocks_export | cascade.import | Bulk-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. | Tenant | Call with the parsed rocks array. |
rost_import_objectives_and_key_results_from_a_generic_okr_csv | cascade.import_okrs | Bulk-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. | Tenant | Call with the parsed objectives array (optionally parent_objective_id). |
rost_import_a_ninety_v_to_into_a_compass_draft | compass.import | AI-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). | Tenant | Call with the extracted V/TO text (and optional source_name). |
rost_list_cascade_goals | goal.list | List Cascade goals, optionally by cycle or seat. | Seat or tenant-admin | Call with {} or {"cycle_id":"<id>"}. |
rost_get_cascade_goal | goal.get | Get one goal's core detail and status by id. Seat-scoped callers may only read their own seat's goals. | Seat or tenant-admin | Call with {"goal_id":"<id>"}. |
rost_list_a_cascade_goals_signals | goal.list_measurables | List 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-admin | Call with {"goal_id":"<id>"}. |
rost_create_cascade_goal | goal.create | Create 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 membership | Seat 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_goal | goal.update | Update a goal's title or definition of done. | Tenant | Call with goal_id and the changed fields (title, definition of done, or target date). |
rost_set_cascade_goal_status | goal.set_status | Set a goal's status (on/off/done). | Seat or tenant-admin | Seats may set only their own goals. |
rost_set_cascade_goal_progress | goal.set_progress | Report a goal's quantified progress (0-100). An agent's progress is a proposal a human approves before the goal moves. | Seat or tenant-admin | Seats set only their own goals; expect confirmation. |
rost_bind_a_signal_to_a_cascade_goal | goal.bind_measurable | Bind 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-admin | Call 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_goal | goal.unbind_measurable | Remove a goal↔measurable binding (role defaults to drives_status; pass "role":"informs" to remove an indicator). | Seat or tenant-admin | Call with {"goal_id":"<id>","measurable_id":"<id>"}. |
rost_toggle_signal_driven_auto_status | goal.set_auto_status | Per-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-admin | Call with {"goal_id":"<id>","enabled":true}; expect confirmation. |
rost_list_at_risk_cascade_goals | goal.list_at_risk | List goals projected off pace (at-risk or projected-miss) with days behind pace. Read-only; status-only goals excluded. | Tenant | Call with {}. |
rost_reparent_cascade_goal | goal.reparent | Move a goal under a new parent. | Tenant | Authority change; expect confirmation. |
rost_reassign_cascade_goal_owner_seat | goal.reassign_owner | Reassign a seat goal's owner seat to a different seat in the same tenant; cycle and parent ancestry are unchanged. | Tenant | Authority change; expect confirmation. |
rost_drop_cascade_goal | goal.drop | Drop (retire) a goal, retained for audit. | Tenant | Expect confirmation. |
rost_list_friction_issues | friction.list | List Friction issues ranked by impact and severity. | Seat or tenant-admin | Call with {} or {"status":"active"}. |
rost_get_friction_issue | friction.get | Get full detail for one Friction issue by id. | Seat or tenant-admin | Call with {"issue_id":"<id>"}. |
rost_assist_friction_issue | friction.assist | Advisory 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. | Tenant | Call with {"issue_id":"<id>"}. |
rost_update_friction_issue_status | friction.update_status | Move a non-terminal issue between open and diagnosing. | Seat or tenant-admin | Call with issue_id and status. |
rost_resolve_friction_issue | friction.resolve | Resolve an issue with a root cause and remediation task. | Tenant | Human decision; expect confirmation. |
rost_link_task_to_friction_issue | friction.link_task | Attach an existing task as an issue's action task. | Seat or tenant-admin | Call with issue_id and task_id. |
rost_find_stale_friction | friction.stale_candidates | List 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. | Tenant | Call with optional stale_after_days and limit; feed the returned ids to friction.bulk_resolve. |
rost_bulk_resolve_friction | friction.bulk_resolve | Resolve 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. | Tenant | Human decision; expect confirmation. Call with issue_ids and root_cause. |
rost_create_task | task.create | Create a task (a commitment between seats). | Seat or tenant-admin | none — 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_task | task.update | Reschedule, 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_brief | sync.brief.compile | Compile the weekly Sync Brief (idempotent per period). | Tenant | Call with {}. |
rost_get_sync_brief | sync.brief.get | Read the latest or a specific Sync Brief and agenda. | Seat or tenant-admin | Call with {} or {"sync_brief_id":"<id>"}. |
rost_start_sync_run | sync.run.start | Ensure a Sync Brief exists so the meeting can begin. | Tenant | Call with {}. |
rost_complete_sync_run | sync.run.complete | Record that the Sync meeting completed (idempotent). | Tenant | Call with {"sync_brief_id":"<id>"}. |
rost_assign_sync_follow_up | sync.item.assign | Create a follow-up task from a Sync agenda item. | Tenant | Call with brief, owner seat, title, description. |
rost_list_escalations | escalation.list | List 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-admin | Call with {} or {"include_decided":true}. |
rost_get_escalation | escalation.get | Read 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-admin | Call with {"id":"<escalation-id>"}. Resolve/reject are human-only and not exposed over MCP. |
rost_find_stale_escalations | escalation.stale_candidates | List 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. | Tenant | Call with optional stale_after_days and limit. The bulk override (escalation.bulk_resolve) is human-only and not exposed over MCP. |
rost_check_compass_alignment | compass.alignment | Advisory 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. | Tenant | Call with {}. |
rost_team_health_score | team.health_score | Read the single rolled-up 0-100 team-health score (latest month) with its band and label. | Tenant | Call with {}. |
rost_show_compass_as_markdown | compass.show_markdown | Render the current Compass and its open gaps as a clean markdown card for review. | Tenant | Call with {}. |
rost_show_charter_as_markdown | charter.show_markdown | Render a seat's active or latest Charter as a clean markdown card for review. | Tenant | Call with {"seat_id":"<seat-id>"}. |
rost_show_agent_setup_as_markdown | agent.show_markdown | Render a seat's agent setup, model, steward, tools, and Charter as a clean markdown card for review. | Tenant | Call with {"seat_id":"<seat-id>"}. |
rost_list_tool_catalog | tool.catalog | List the discoverable tool catalog the agent builder reads — id, prescriptive description, scope tiers, credential requirement, access policy, and execution-boundary guidance. | Tenant | Call with {} or {"provider":"google"}. |
rost_list_tenant_capability_grants | tool_grants.tenant.list | List tenant capability ceilings/defaults with connection, availability, source, and compile status. | Tenant | Call with {}; no secrets or vault refs. |
rost_update_tenant_capability_policy | tool_grants.tenant.update | Change tenant-wide capability ceilings/defaults with optimistic policy version or digest protection. | Tenant-admin | Human-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_grants | tool_grants.agent.effective | Read 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. | Tenant | Call with {"agent_id":"<agent-id>"}. |
rost_build_agent_activation_receipt | agent.activation_receipt | Build the current activation receipt for an agent: capabilities, connection metadata, digest, budget, and always-human boundary. | Seat or tenant-admin | Call with {"agent_id":"<agent-id>"}; rebuild after Charter, connection, lane, schedule, or grant changes. |
rost_sign_agent_activation_receipt | agent.activation_sign | Human steward/admin sign-off for the exact activation receipt digest. | Tenant | Human-gated; call with {"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}. |
rost_create_agent_trusted_grant | agent.trust.create | Create 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. | Tenant | Human steward/admin only; call with {"agent_id":"<agent-id>","expected_scope_digest":"sha256:...","budget_cents":2500}. |
rost_inspect_agent_trusted_grants | agent.trust.inspect | Inspect active or historical Trusted grants for one agent. | Seat or tenant-admin | Call with {"agent_id":"<agent-id>","include_inactive":true}; metadata only. |
rost_revoke_agent_trusted_grant | agent.trust.revoke | Revoke an active Trusted grant while preserving history. | Tenant | Human steward/admin only; call with {"grant_id":"<grant-id>","reason":"..."}; non-interactive callers receive a confirmation handoff. |
rost_expire_agent_trusted_grants | agent.trust.expire | Mark overdue active Trusted grants expired and append audit events. | Tenant | Human steward/admin only; call with {"agent_id":"<agent-id>"}. |
rost_supersede_agent_trusted_grant | agent.trust.supersede | Replace 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). | Tenant | Human 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_interventions | agent_grant_intervention.list | List 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-admin | Call with {} (or {"seat_id":"<seat-id>","include_decided":true}). |
rost_decide_a_blocked_agent_grant | agent_grant_intervention.decide | Grant (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. | Tenant | Call 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_intervention | agent_grant_intervention.resume | Retry 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. | Tenant | Call with {"intervention_id":"<intervention-id>"}. |
rost_suggest_setup_capability_grants | agent_setup.capability_suggestions | Suggest deterministic minimum capability grants from the current setup/template and tenant grant availability. | Tenant | Call with {"seat_id":"<seat-id>"} or {"setup_id":"<agent-id>"}; no model call and no mutation. |
rost_list_skills | skill.list | List tenant Skills with application descriptors, dependency metadata, source status, latest version, and assigned Seat count. Seat-scoped reads are available through rost://skills. | Tenant-admin | Call with {} or {"query":"invoice"}. |
rost_list_rost_skill_catalog | skill.catalog | List entitled ROST catalog Skills. Private catalog source URLs and credentials stay server-side. | Tenant-admin | Call with {}; use {"include_unentitled":true} only to inspect tier availability. |
rost_enable_rost_catalog_skill | skill.enable_catalog | Enable an entitled ROST catalog Skill into the company library with human confirmation. | Tenant-admin | Call with {"slug":"rost/ap-review"}; non-interactive callers receive a confirmation handoff. |
rost_install_skill_locally | skill.install_local | Resolve 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-admin | Call with {"slug":"invoice-review","client":"codex"}; rost/<slug> enablement may require confirmation. |
rost_sync_assigned_skills_locally | skill.sync_local | Resolve every approved Skill assigned to a Seat plus revoked local-copy markers for a local client sync. | Tenant-admin | Call with {"seat_id":"<seat-id>","client":"codex"}; local clients remove revoked copies. |
rost_get_skill | skill.get | Read one Skill descriptor and latest stored version metadata. Seat-scoped reads are available through rost://skills/{slug}. | Tenant-admin | Call with {"slug":"invoice-review"}. |
rost_get_skill_file | skill.file.get | Read 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-admin | Call with {"slug":"invoice-review","path":"SKILL.md"}. |
rost_list_assigned_skills | skill.assigned.list | List 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-admin | Call with {"seat_id":"<seat-id>"}. |
rost_check_skill_dependencies | skill.check_dependencies | Compare 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-admin | Call with {"seat_id":"<seat-id>","slug":"invoice-review"}. |
rost_create_skill | skill.create | Create a tenant Skill draft or pending-review Skill from a bounded text package. | Tenant-admin | Call with {"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}. |
rost_update_skill_draft | skill.update_draft | Replace or create the current unpublished draft version for an existing Skill. | Tenant-admin | Call with {"slug":"invoice-review","package":{"files":[{"path":"SKILL.md","content":"..."}]}}. |
rost_import_github_skill | skill.import_github | Import a public GitHub Skill package into pending review or draft after validation. | Tenant-admin | Call with {"url":"https://github.com/acme/skills/tree/main/ap","status":"pending_review"}. |
rost_import_uploaded_skill | skill.import_upload | Import a bounded structured text package. MCP does not accept direct binary uploads in this release. | Tenant-admin | Call with {"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}. |
rost_publish_skill | skill.publish | Human-gated publication of an unpublished Skill version. Published versions are immutable and assignable. | Tenant-admin | Call with {"slug":"invoice-review"}; non-interactive callers receive a confirmation handoff. |
rost_assign_skill_to_seat | skill.assign_to_seat | Propose or human-approve a published Skill version for a Seat after dependency checks. Missing required tools block approval; optional tools warn. | Tenant-admin | Call with {"seat_id":"<seat-id>","slug":"invoice-review","status":"proposed","rationale":"Use for AP exception work."}. |
rost_revoke_skill_from_seat | skill.revoke_from_seat | Human-gated revocation that stops future Skill use without deleting historical activations. | Tenant-admin | Call with {"assignment_id":"<assignment-id>"}; non-interactive callers receive a confirmation handoff. |
rost_list_model_catalog | model.catalog | List guided model tiers — recommendations, token prices, cost bands, best-fit work, and model ids for --model. | Tenant | Call with {}. |
rost_create_a_forge_project | software_factory.project.create | Create an active Forge software project before binding repositories or opening build requests. Tenant-admin, human-gated, and entitlement-gated. | Tenant-admin | Call with {"name":"Leiluna app","slug":"leiluna-app","base_branch":"main"}; non-interactive callers receive a confirmation handoff. |
rost_create_a_forge_build_request | software_factory.request.create | Open 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. | Tenant | Call with {"project":"<slug-or-name>","title":"Add invoice export"} (or {"software_project_id":"<project-id>", ...}). |
rost_pause_a_forge_build_request | software_factory.request.pause | Pause an in-flight Forge build request. New runner claims stop immediately; running work halts at the next task checkpoint. Human-gated. | Tenant-admin | Call with {"build_request_id":"<request-id>","reason":"Operator hold"}; non-interactive callers receive a confirmation handoff. |
rost_cancel_a_forge_build_request | software_factory.request.cancel | Cancel a Forge build request and expire active runner work orders. This is terminal; use pause for reversible holds. Human-gated. | Tenant-admin | Call with {"build_request_id":"<request-id>","reason":"Out of scope"}; non-interactive callers receive a confirmation handoff. |
rost_resume_a_forge_build_request | software_factory.request.resume | Resume a paused or human-blocked Forge build request from the last completed task checkpoint and requeue the current phase. Human-gated. | Tenant-admin | Call with {"build_request_id":"<request-id>","reason":"Budget raised"}; non-interactive callers receive a confirmation handoff. |
rost_list_forge_projects | software_factory.project.list | List active Forge software projects so a tenant can choose a project for build requests, GitHub repository bindings, and config. | Tenant | Call with {}; use the returned id as software_project_id. |
rost_list_forge_build_requests | software_factory.request.list | The 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. | Tenant | Call with {} or {"limit":20}. |
rost_show_a_forge_build_request | software_factory.request.show | The 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. | Tenant | Call with {"build_request_id":"<request-id>"}. |
rost_advance_a_forge_build_request_phase | software_factory.phase.advance | Advance a build request to its next phase; the server enforces the closed phase state machine and rejects an illegal transition. | Tenant | Call with {"build_request_id":"<request-id>","to_phase":"discovery_scoping"}. |
rost_decide_a_forge_gate | software_factory.gate.decide | A 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. | Tenant | Call with {"gate_id":"<gate-id>","decision":"approve"}; non-interactive callers receive a confirmation handoff. |
rost_serialize_a_forge_dispatch_collision | software_factory.dispatch.serialize | A human appends a tightening depends_on edge to serialize two colliding Forge tasks (advisory-driven; never auto-blocks). Records a human decision. | Tenant-admin | Call 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_clarifications | software_factory.request.answer_clarification | Write 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. | Tenant | Call with {"build_request_id":"<request-id>","answers":[{"question":"Which database?","answer":"Postgres"}],"mark_ready_for_plan_review":true}. |
rost_approve_a_forge_plan | software_factory.plan.approve | A 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-admin | Call with {"build_request_id":"<request-id>"}; non-interactive callers receive a confirmation handoff. |
rost_reject_a_forge_plan | software_factory.plan.reject | A 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-admin | Call with {"build_request_id":"<request-id>","rationale":"Scope too broad"}; non-interactive callers receive a confirmation handoff. |
rost_list_forge_authority_profiles | software_factory.authority_profile.list | List the tenant's Forge authority profiles (seat capability presets, read-only by default). Read-only; requires the Forge add-on. | Tenant | Call with {}. |
rost_create_a_forge_authority_profile | software_factory.authority_profile.create | Define a Forge authority profile (a named seat capability preset). Owner-only; defaults to the read_only preset. | Tenant-admin | Call with {"name":"Builder","preset":"contributor"}. |
rost_grant_forge_seat_authority | software_factory.authority.grant | Grant a seat a Forge authority profile on a project (seat → project → profile). Owner-only and human-gated; emits a durable authority-change event. | Tenant-admin | Call 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_authority | software_factory.authority.revoke | Revoke a Forge authority grant (teardown). Owner-only and human-gated. | Tenant-admin | Call with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff. |
rost_install_forge_developer_team | software_factory.developer_team.install | Install 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-admin | Call 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_team | software_factory.developer_team.uninstall | Tear 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-admin | Call with {} (optionally {"reason":"offboarding"}); non-interactive callers receive a confirmation handoff. |
rost_list_forge_config | software_factory.config.list | List 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. | Tenant | Call with {} or {"software_project_id":"<project-id>","environment":"preview"}. |
rost_set_forge_config | software_factory.config.set | Human-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-admin | Call 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_requests | software_factory.secret_request.list | List missing-secret requests and their approval Task ids/statuses. It returns request metadata only — no secret values and no vault refs. | Tenant | Call with {} or {"status":"pending"}. |
rost_grant_a_forge_secret | software_factory.secret.grant | A 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-admin | Call 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_grant | software_factory.secret.revoke | Revoke a Forge secret grant (teardown — cut a compromised seat's access immediately). Owner-only and human-gated. | Tenant-admin | Call with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff. |
rost_set_a_forge_github_automation_policy | software_factory.github.policy.upsert | Set 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-admin | Call 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_token | software_factory.github.installation_token.create | Mint a short-lived GitHub App installation token for one bound repository after policy evaluation. The token is returned once and never stored. | Tenant | Call with {"software_project_id":"<project-id>","repository_id":789,"requested_actions":["read"],"requested_automation_mode":"plan_only"}. |
rost_list_forge_github_installations | software_factory.github.installation.list | List connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only. | Tenant | Call with {}; a connected repository is verified but not yet bound to a project. |
rost_list_forge_vercel_links | software_factory.vercel.project.list | List connected Vercel accounts/teams and linked existing Vercel projects. Read-only; no OAuth tokens or vault refs are returned. | Tenant | Call with {}; tenant admins connect/link from /forge/settings/vercel. |
rost_create_a_forge_vercel_preview_deployment | software_factory.vercel.deploy_preview | Create 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. | Tenant | Call 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_capacity | software_factory.capacity.list | List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on. | Tenant | Call 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.
| Tool | Command | What it does | Scope | Notes |
|---|---|---|---|---|
rost_grant_a_brokered_secret | secret_grant.grant | A 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-admin | Call 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_grant | secret_grant.revoke | Revoke 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-admin | Call with {"grant_id":"<grant-id>"}; non-interactive callers receive a confirmation handoff. |
rost_list_stored_credentials | credential.list | List 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-admin | Call 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.
| Tool | Command id | Purpose | Scope | Safe example |
|---|---|---|---|---|
rost_get_context | (read) seat-context bundle | Retrieve 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. | Seat | Call first with {}. |
rost_get_tasks | task.list | List open tasks visible to the seat. Each task's due_on is an ISO date string (YYYY-MM-DD) or null. | Seat | Call with {}. |
rost_accept_task | task.accept | Accept a task owned by the seat. | Seat | Call with {"task_id":"<task-id>"}. |
rost_decline_task | task.decline | Decline a task with a reason. | Seat | Call with task_id and reason. |
rost_report_status | status.record | Write a status event. | Seat | Call with a concise status payload. |
rost_complete_task | task.complete | Complete a task and record evidence. | Seat | Call with task_id and evidence. |
rost_escalate | escalation.raise | Escalate approval-scope or must-escalate work. | Seat | Call 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_issue | friction.file_issue | File a Friction issue. | Seat | Call 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_work | work.log | Record 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. | Seat | Call with summary and evidence. |
rost_report_a_signal_reading | signal.report | Propose one draft reading for this seat's own agent-sourced measurable. The reading lands unconfirmed for human review. | Seat | Call with {"measurable_id":"<id>","value":42,"note":"read off the source","confidence":"high"}. |
rost_draft_first_readings_from_a_connected_source | signal.draft_first_readings | Pull 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. | Seat | Call with {"measurable_id":"<id>"}. |
rost_create_agent_deliverable | deliverable.create | Create a scrubbed durable work output for the acting seat. | Seat | Call with title, kind, summary/content, and optional safe links. |
rost_attach_agent_deliverable | deliverable.attach | Attach a scrubbed deliverable to a source run, task, or work order after server-side seat validation. | Seat | Call with title, kind, and the source ids that belong to the acting seat. |
rost_record_work | work.record | Append 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. | Seat | Call 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_records | work.list | List the seat's work-ledger records newest-first (keyset-paginated), filterable by verb, object kind/ref, outcome, or run. | Seat | Call with {"verb":"contacted","object_kind":"supplier","limit":50}. |
rost_request_a_forge_secret_grant | software_factory.secret.request | Request 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. | Seat | Call 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_access | software_factory.secret.use | Verify 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. | Seat | Call 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_grant | secret_grant.request | A 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. | Seat | Call 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_grants | secret_grant.list | List 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. | Seat | Call with {} (an agent is server-pinned to its own seat). |
rost_record_forge_conformance_findings | software_factory.conformance.record_findings | A 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. | Seat | Call with {"build_request_id":"<request-id>","findings":[{"severity":"major","category":"scope_gap","summary":"Missing migration verification","changeset_id":"<changeset-id>"}]}. |
rost_resolve_forge_conformance_finding | software_factory.conformance.resolve_finding | A 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. | Seat | Call with {"build_request_id":"<request-id>","finding_ids":["<finding-id>"]}. |
rost_decide_a_conversational_gate | gate.decide | A 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.
| Resource | Purpose | Scope | Safe example |
|---|---|---|---|
rost://tenant/status | Current user, tenant, role/scope, and onboarding status. | Tenant-admin | Read before driving tenant setup. |
rost://graph | Responsibility Graph: seats, edges, root, occupants, display-only planned occupants, status rollups. | Tenant-admin | Read before routing or reparenting work. |
rost://seat/{id}/context | A 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/current | Active and draft Compass versions plus source documents. | Tenant-admin | Read before drafting Compass changes. |
rost://sync/latest | The most recent compiled Sync Brief and its agenda. | Tenant-admin | Read before running the weekly Sync. |
rost://skills | Tenant Skills library for tenant-admin tokens; assigned published Skills for seat tokens. | Tenant-admin or seat | Read before creating, assigning, or loading Skill instructions. |
rost://skills/{slug} | One Skill descriptor and latest stored version metadata. | Tenant-admin or assigned seat | Read 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 seat | Read rost://skills/<slug>/files/SKILL.md. |
rost://agents/templates | Stock agent templates: responsibilities, default tools, safety boundaries, and dry-run rehearsal. | Tenant-admin | Read 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-admin | Read rost://agent-setup/<setup-id> to resume a draft. |
rost://seat/{id}/agent-status | A 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}/skills | Approved 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-map | Machine-facing map of which guide to read before each workflow. | Any valid MCP token | Read 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 retryrost 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, thenrost 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 --helpor clear the npm cache. - MCP connection not working after registering: call
rost_list_commandswith{}(any token); with a tenant-admin token readrost://tenant/status, with a seat-scoped token callrost_get_contextwith{}(a seat token cannot readrost://tenant/status). A 401 / not-authorized shape means the token did not register — re-runmcp 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 bymcp installdefault to a 90-day expiry — checkexpires_in_daysinrost command mcp_token.list; mint with--expires-in <days>or--no-expiryto change it. - Confirmation required: a human approves from the
approveViaweb link or runs therost 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>(commandsettings.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", orrost reference get agent-reference-map. - Need MCP guidance: call
rost_reference_getwith{"slug":"agent-reference-map"}.