@rosthq/cli 0.5.7 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -27867,6 +27867,11 @@ var marketingUrl = process.env.NEXT_PUBLIC_MARKETING_URL ?? "";
27867
27867
  var BRAND = {
27868
27868
  name: "ROST",
27869
27869
  legalName: "ROST, Inc.",
27870
+ // The legal entity that operates the product and publishes the privacy policy
27871
+ // / terms (the data controller). Distinct from the product brand name — the
27872
+ // operating company is not subject to brand/trademark renaming. Set via env
27873
+ // (e.g. "SKBD LLC"); falls back to the product legal name when unset.
27874
+ operatingEntity: process.env.NEXT_PUBLIC_LEGAL_ENTITY?.trim() || "ROST, Inc.",
27870
27875
  tagline: "Mission control for humans and AI.",
27871
27876
  categoryDescriptor: "The agentic operating system for hybrid companies.",
27872
27877
  domain: domainFromUrl(marketingUrl),
@@ -41486,7 +41491,7 @@ var referenceDocuments = [
41486
41491
  order: 10,
41487
41492
  title: "{{brand}} implementation method",
41488
41493
  summary: "The staged operating-system setup path used by humans, CLI sessions, MCP clients, and in-app agents.",
41489
- version: "2026-06-18.1",
41494
+ version: "2026-06-18.2",
41490
41495
  public: true,
41491
41496
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41492
41497
  stages: ["company_setup", "graph_design", "charter_design", "staffing", "operating_rhythm"],
@@ -41554,6 +41559,10 @@ Build the Responsibility Graph from functions and seats first. Do not start by a
41554
41559
 
41555
41560
  The first graph should be small enough to understand. Start with the top operating seat, then major functions, then the first operational seats that carry measurable work. Add detail only when it clarifies ownership.
41556
41561
 
41562
+ ### Solo founders and small flat teams
41563
+
41564
+ If it is just you, or a small flat team of four or fewer people, declare that at the start of org intake. Setup skips the org-chart upload and the "who reports to you" question, and instead asks which functions the company needs covered today. It proposes a standard small-company function tree \u2014 company leadership, revenue, sales, marketing, delivery and operations, finance and admin \u2014 that you occupy, then pivots straight to which functions to staff with agents. Because there is no one to invite, the team-invite step is skipped. You can still invite people later from settings.
41565
+
41557
41566
  ## Stage 3: Convert seats into Charters
41558
41567
 
41559
41568
  A Charter is the executable job description for a seat. It should define purpose, responsibilities, autonomous scope, approval scope, must-escalate conditions, measurables, and tool permissions.
@@ -41591,7 +41600,7 @@ The Compass is drafted, then activated by a human through supersession.
41591
41600
  order: 20,
41592
41601
  title: "Responsibility Graph playbook",
41593
41602
  summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
41594
- version: "2026-06-18.1",
41603
+ version: "2026-06-18.2",
41595
41604
  public: true,
41596
41605
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41597
41606
  stages: ["graph_design", "staffing"],
@@ -41638,6 +41647,13 @@ Each entry opens the same conservative setup flow \u2014 seat placement, Steward
41638
41647
 
41639
41648
  The graph canvas fits the whole structure into the frame when it opens and refits whenever the frame changes \u2014 opening a side panel, resizing the window, or rotating a phone. Zoom moves between three altitudes: a constellation of seat dots when zoomed out, seat cards at the working zoom, and charter detail when zoomed in. Seat cards stay legible on small screens, and the canvas is the one always-dark surface in the otherwise light app. Search the toolbar to fly to any seat by name.
41640
41649
 
41650
+ The graph is also where you land after onboarding \u2014 it is the mission control for the company, not a separate dashboard. Switch lenses from the toolbar to recolour the same structure four ways:
41651
+
41652
+ - **Structure** \u2014 seat type and reporting lines.
41653
+ - **Cascade** \u2014 whether each seat's goal branch is on track.
41654
+ - **Signal** \u2014 the worst measurable state per seat.
41655
+ - **Scoreboard** \u2014 two live numbers on every seat: work done (agent runs) and cost over the last 30 days. A seat whose cost is a clear outlier above the rest of the fleet is flagged as cost drift (labelled, not colour-only). Human seats and seats with no runs read calmly as no agent cost rather than a bare zero. For a small fleet the Scoreboard also leads with a two-tile summary \u2014 total work and total cost \u2014 framed as the single question that matters: is it earning its keep.
41656
+
41641
41657
  ## First-pass structure
41642
41658
 
41643
41659
  Start with the operating root, then major functions, then the few seats that own the most important recurring work. Do not over-model. A graph with eight clear seats is better than a graph with thirty vague boxes.
@@ -41769,11 +41785,11 @@ Drafting can be assisted by agents. Activation is a human decision. When authori
41769
41785
  order: 40,
41770
41786
  title: "Agent staffing playbook",
41771
41787
  summary: "How to decide whether a seat should be human, agent, or hybrid, and how to go live safely.",
41772
- version: "2026-06-18.1",
41788
+ version: "2026-06-19.2",
41773
41789
  public: true,
41774
41790
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41775
41791
  stages: ["staffing"],
41776
- relatedCommandIds: ["staffing.assign_user", "staffing.assign_agent_dry_run", "agent.go_live", "agent.status", "mcp_token.create", "agent_template.list", "agent.create_from_template", "agent_setup.start", "agent_setup.get", "agent_setup.update", "agent.update_schedule", "agent.decommission", "agent.create_custom", "agent.configure_tools", "agent.run_dry_run", "confirmation.approve"],
41792
+ relatedCommandIds: ["staffing.assign_user", "staffing.assign_agent_dry_run", "agent.go_live", "agent.status", "agent.run_now", "agent.get_run", "agent.list_runs", "agent.list_tool_calls", "mcp_token.create", "agent_template.list", "agent.create_from_template", "agent_setup.start", "agent_setup.get", "agent_setup.update", "agent.update_schedule", "agent.decommission", "agent.create_custom", "agent.configure_tools", "agent.run_dry_run", "confirmation.approve"],
41777
41793
  legal: {
41778
41794
  publicRisk: "low",
41779
41795
  notes: [
@@ -41814,6 +41830,12 @@ A seat can be human, agent, or hybrid. The staffing decision should follow the w
41814
41830
  5. Review Signal, Friction, and tool-call audit rows.
41815
41831
  6. Human approves go-live.
41816
41832
 
41833
+ ## In the onboarding funnel
41834
+
41835
+ Staffing your first agent is a step in onboarding, right before the finish step. Its content is the stock-template gallery: pick a template to staff an agent seat, and you continue on the agents surface to name the Steward, sign the manifest, and run the sandbox dry run \u2014 the same draft-first path described below, not a separate one. Staffing the first agent is the activation moment, so the funnel asks for it before exit.
41836
+
41837
+ Working solo, or staffing later? Skip the step with intent and finish onboarding without an agent. Nothing is forced: you can staff an agent any time from the agents surface, and the staffing decision still follows the work, the risk, and the measurable.
41838
+
41817
41839
  ## Create and stage an agent from CLI or MCP
41818
41840
 
41819
41841
  Two creation paths, both draft-first. Read the stock-agents guide for templates and the how-agents-work guide for the operating loop.
@@ -41821,10 +41843,12 @@ Two creation paths, both draft-first. Read the stock-agents guide for templates
41821
41843
  - From a template: list with \`agent_template.list\` / \`rost_list_agent_templates\`, then \`agent.create_from_template\` / \`rost_create_agent_from_template\` with \`seat_id\` and \`template_slug\`. Returns a draft agent and draft Charter only.
41822
41844
  - Custom: \`agent_setup.start\` / \`rost_start_agent_setup\` (returns a \`setup_id\`), iterate with \`agent_setup.get\` and \`agent_setup.update\`, then \`agent.create_custom\` / \`rost_create_custom_agent\`. Stage tools with \`agent.configure_tools\` (vault refs only) and sandbox with \`agent.run_dry_run\`.
41823
41845
  - Inspect runtime: \`agent.status\` / \`rost_get_agent_status\` with \`{"seat_id":"<seat-id>"}\` returns lane, live state, steward chain, dry-run result, and Runner availability.
41846
+ - Run on demand: \`{{cli}} agent run-now --seat-id <seat-id>\` / \`agent.run_now\` / \`rost_run_agent_now\` queues an immediate live run without changing the saved schedule. Cloud agents dispatch to the Inngest executor; runner agents queue work for the paired runner. The command is ungated but still requires a live staffed agent and the normal server-side tool guard.
41847
+ - Audit what an agent did (Trust Card): \`{{cli}} command agent.list_runs --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_runs\` returns the seat's run history with per-run tool-call and guard-held counts; \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id>\` / \`agent.get_run\` / \`rost_get_agent_run_diagnostics\` reads one run's transcript reference, token/cost usage, outcome, and product-visible run errors; \`{{cli}} command agent.list_tool_calls --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_tool_calls\` returns the tool-call ledger with each call's guard result. Both list commands include a \`denied_tool_call_count\` rollup \u2014 the actions held because they exceeded the charter. Pass \`{"seat_id":"<seat-id>","held_only":true}\` to \`agent.list_tool_calls\` for only the held calls. The web seat page shows the same facts as a Trust Card.
41824
41848
 
41825
41849
  ## When to stop for confirmation
41826
41850
 
41827
- \`agent.create_from_template\`, \`agent.create_custom\`, \`staffing.assign_user\`, \`agent.go_live\`, \`agent.update_schedule\`, and \`mcp_token.create\` are \`human_required\`; \`agent.configure_tools\` and \`credential.ingress\` are \`credential_flow\` (both gate through the vault-backed credential path with human approval; \`agent.configure_tools\` stages the request and only \`credential.ingress\` takes the raw secret, as a vault reference); \`agent.decommission\` is \`dangerous\`. An agent may draft, configure (with vault refs), and dry-run; the human approves go-live, credentials, schedule changes, and decommission. \`run_dry_run\` is ungated by human approval, but it is **precondition-gated**: the seat's permission manifest must be signed first (\`charter.sign_manifest\`). Attempting a dry run before sign-off returns a clean \`COMMAND_PRECONDITION_FAILED\` naming \`charter.sign_manifest\`, not a generic failure. Go-live after a passed dry run is \`human_required\`. See the confirmations guide.
41851
+ \`agent.create_from_template\`, \`agent.create_custom\`, \`staffing.assign_user\`, \`agent.go_live\`, \`agent.update_schedule\`, and \`mcp_token.create\` are \`human_required\`; \`agent.configure_tools\` and \`credential.ingress\` are \`credential_flow\` (both gate through the vault-backed credential path with human approval; \`agent.configure_tools\` stages the request and only \`credential.ingress\` takes the raw secret, as a vault reference); \`agent.decommission\` is \`dangerous\`. \`agent.run_now\` is not human-gated because it does not expand authority or change the schedule; it only queues an immediate run for an already-live agent. An agent may draft, configure (with vault refs), dry-run, and request an on-demand run; the human approves go-live, credentials, schedule changes, and decommission. \`run_dry_run\` is ungated by human approval, but it is **precondition-gated**: the seat's permission manifest must be signed first (\`charter.sign_manifest\`). Attempting a dry run before sign-off returns a clean \`COMMAND_PRECONDITION_FAILED\` naming \`charter.sign_manifest\`, not a generic failure. Go-live after a passed dry run is \`human_required\`. See the confirmations guide.
41828
41852
 
41829
41853
  ## Non-negotiables
41830
41854
 
@@ -41835,7 +41859,7 @@ No orphan agents. No raw secrets in prompts, logs, or tool arguments. No durable
41835
41859
  order: 41,
41836
41860
  title: "Add agents to your Responsibility Graph",
41837
41861
  summary: "The visual journey for adding an agent seat: where to start, choosing a mode, placing the seat, naming a Steward, setup, the safety gates, and go-live.",
41838
- version: "2026-06-15.2",
41862
+ version: "2026-06-18.1",
41839
41863
  public: true,
41840
41864
  audiences: ["human", "in_app_agent"],
41841
41865
  stages: ["staffing"],
@@ -41908,14 +41932,14 @@ Reopening the builder for a seat whose agent is already live shows its live stat
41908
41932
  - Parent or Steward seat archived during setup: go-live is blocked until you choose a live parent or reassign the Steward.
41909
41933
  - Failed dry run or a declined tool: the draft is preserved; fix the Charter or tool decision and rerun. See the troubleshooting guide.
41910
41934
 
41911
- In read-only or demo mode the **Add agent** affordance is disabled or routes to sign-up rather than attempting a change.`
41935
+ In read-only or demo mode the **Add agent** affordance never starts a write. The public demo instead replays the add-an-agent journey end to end \u2014 describe the role, watch the draft Charter assemble, see the four safety gates light, and watch a sandbox dry run reach the must-escalate boundary and stop \u2014 then routes go-live to sign-up, because going live is a human decision.`
41912
41936
  },
41913
41937
  {
41914
41938
  slug: "custom-agents-guide",
41915
41939
  order: 42,
41916
41940
  title: "Design a custom agent",
41917
41941
  summary: "How to build a custom agent from operational questions through the Charter Builder, tools, dry run, and go-live without writing prompts.",
41918
- version: "2026-06-18.2",
41942
+ version: "2026-06-18.4",
41919
41943
  public: true,
41920
41944
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41921
41945
  stages: ["staffing", "charter_design"],
@@ -41945,15 +41969,23 @@ Begin from the agents surface (**Design a custom agent**) or from the CLI/MCP. T
41945
41969
 
41946
41970
  From your answers, the Charter Builder drafts responsibilities, decision authority, Signals, handoffs, and escalation rules. Review and edit every clause. Keep the autonomous scope tight at first; you can grant more authority later once dry runs and evidence justify it.
41947
41971
 
41948
- ## Choose a lane
41972
+ ## Choose a lane and a trigger
41973
+
41974
+ Pick where the agent runs and what starts it. Both lead with a safe default, so a non-technical operator never has to write a raw schedule or reason about an internal lane name.
41949
41975
 
41950
41976
  A custom agent runs on one of three lanes:
41951
41977
 
41952
- - **Cloud agent** \u2014 the {{brand}}-managed runtime using the tenant model key.
41978
+ - **Cloud agent** (recommended) \u2014 the {{brand}}-managed runtime using the tenant model key. It needs no local machine, pairing, or token, so it is the default if you are unsure.
41953
41979
  - **External MCP agent** \u2014 a Claude Code, Codex, or Cursor agent that connects to {{brand}} as the seat.
41954
41980
  - **Local Runner** \u2014 scheduled local execution through a paired Runner.
41955
41981
 
41956
- Lane and schedule stay advanced unless the work needs them.
41982
+ Then choose one of three named triggers:
41983
+
41984
+ - **On demand** (default) \u2014 runs only when you or a teammate start it. No schedule.
41985
+ - **Scheduled** \u2014 runs on a recurring cadence you pick (every weekday morning, every morning, weekly, hourly). No cron to write.
41986
+ - **Event** \u2014 runs in response to work routed to it, like a sync or a mention, rather than on a clock.
41987
+
41988
+ Open **Advanced** for the explicit lane select and a raw cron expression when you need a custom cadence. The same schedule presets appear on the agent's seat page after go-live (Agent operations \u2192 Run schedule).
41957
41989
 
41958
41990
  ## Configure tools and credentials
41959
41991
 
@@ -41971,7 +42003,7 @@ The same path is command-backed:
41971
42003
 
41972
42004
  ## Dry run and go-live
41973
42005
 
41974
- The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provider run derived from the Charter \u2014 the agent works against sandbox data only and is expected to escalate where the Charter's must-escalate clause requires it. The result is earned: a run that escalates the must-escalate boundary passes; a run that acts on that boundary instead of escalating fails. A failed dry run keeps the draft and shows the reason so you can edit and rerun. The rehearsal returns a transcript \u2014 the steps the agent took and the escalation it raised \u2014 shown step by step in the builder and printed by the CLI, so you can see the governance model working before anything goes live. When the dry run passes, a human promotes the agent live. The dry run rehearses the specific model tier you chose, so once it passes the model is locked \u2014 changing the model requires re-running the dry run on the new model before go-live.
42006
+ The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provider run derived from the Charter \u2014 the agent works against sandbox data only and is expected to escalate where the Charter's must-escalate clause requires it. The same rehearsal works on all three lanes: cloud, external MCP, and local Runner. External MCP dry runs require an active seat-scoped MCP token; Runner dry runs require a paired Runner. Missing substrate returns a typed precondition error, not a generic failure. The recorded run keeps the agent's actual lane, so the evidence you review matches the lane you selected. The result is earned: a run that escalates the must-escalate boundary passes; a run that acts on that boundary instead of escalating fails. A failed dry run keeps the draft and shows the reason so you can edit and rerun. The rehearsal returns a transcript \u2014 the steps the agent took and the escalation it raised \u2014 shown step by step in the builder and printed by the CLI, so you can see the governance model working before anything goes live. When the dry run passes, a human promotes the agent live. The dry run rehearses the specific model tier you chose, so once it passes the model is locked \u2014 changing the model requires re-running the dry run on the new model before go-live.
41975
42007
 
41976
42008
  ## When to stop for confirmation
41977
42009
 
@@ -42052,7 +42084,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42052
42084
  order: 45,
42053
42085
  title: "How agents work",
42054
42086
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
42055
- version: "2026-06-18.1",
42087
+ version: "2026-06-19.6",
42056
42088
  public: true,
42057
42089
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42058
42090
  stages: ["staffing", "operating_rhythm"],
@@ -42060,6 +42092,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42060
42092
  "staffing.assign_agent_dry_run",
42061
42093
  "agent.go_live",
42062
42094
  "agent.status",
42095
+ "agent.list_fleet",
42063
42096
  "agent_setup.get",
42064
42097
  "agent_setup.update",
42065
42098
  "agent.decommission",
@@ -42125,16 +42158,29 @@ A seat-scoped MCP token already carries the seat, so its tools (\`rost_get_tasks
42125
42158
 
42126
42159
  \`task.accept\`, \`task.decline\`, \`task.complete\`, \`status.record\`, \`work.log\`, and \`escalation.raise\` are all \`none\` \u2014 a seat operates its own queue and reports its own work directly. None of these carry a confirmation gate. An agent still never approves a human's confirmation on another seat's behalf; these are simply the acting seat's own reversible actions.
42127
42160
 
42161
+ ## How a tool call is executed
42162
+
42163
+ The model is only ever offered the tools the seat's manifest grants \u2014 a denied tool is never even shown to it \u2014 and each tool carries its real input schema, so the model knows exactly what shape an action takes. Some model runtimes see SDK-safe aliases such as \`rost_report_status\`; the server maps those back to the canonical manifest name such as \`rost.report_status\` before guard checks, handler execution, and audit. Tool outcomes return to the model as structured tool-result blocks tied to the provider tool-use id, so retries and transcripts stay reconstructible. When the model proposes a tool call:
42164
+
42165
+ 1. The manifest guard runs first and decides: allowed, denied, or must-escalate. A denied or must-escalate call never runs the action; an escalation is raised for a human.
42166
+ 2. For an allowed call, the proposed input is validated against the tool's schema. Malformed input fails closed \u2014 the action does not run, and the model is told to correct it.
42167
+ 3. The action runs bound to the seat's vaulted credential. The secret stays inside the call and never reaches the result, the audit row, the logs, or the model.
42168
+ 4. Every call \u2014 allowed, denied, escalated, or invalid \u2014 writes a tool-call audit row you can review.
42169
+
42170
+ Provider requests carry only the model payload the runtime needs; run attribution, tenant attribution, usage, and cost are recorded in {{brand}} audit tables after the call, not sent as custom provider metadata.
42171
+
42172
+ Before an agent goes live, the sandbox dry run rehearses this against fake data and returns a per-tool preview: for each tool the agent would touch, whether it would run it, would be blocked, or would escalate \u2014 no external side effect. Review that preview before you approve go-live.
42173
+
42128
42174
  ## What humans should review
42129
42175
 
42130
- Review the first dry runs, tool-call audit rows, escalations, and Signal impact. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
42176
+ Review the first dry runs, fleet overview, tool-call audit rows, escalations, and Signal impact. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalent is \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\`, which returns lane, live state, last real turn, 24h/7d real turns, top measurable status, open escalations, and 7-day spend. Scheduled agents are checked in rounded five-minute buckets, so a minute-level cron inside the bucket queues one work order for that bucket rather than one order per minute. Sandbox dry runs do not count as real turns. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
42131
42177
  },
42132
42178
  {
42133
42179
  slug: "tool-access-and-vault",
42134
42180
  order: 46,
42135
42181
  title: "Tool access and vault",
42136
42182
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
42137
- version: "2026-06-18.1",
42183
+ version: "2026-06-19.2",
42138
42184
  public: true,
42139
42185
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42140
42186
  stages: ["staffing"],
@@ -42174,6 +42220,14 @@ Tool access belongs to the seat, not to a person or a chat session. A tool shoul
42174
42220
 
42175
42221
  Connecting a tool is a human-controlled step. The agent can recommend a tool, explain why it is useful, and draft the manifest. A human approves the tool connection and any credentials.
42176
42222
 
42223
+ ## Generic REST connector
42224
+
42225
+ For an API with no dedicated connector, the generic REST tool lets a seat call an HTTP endpoint with a credential you paste through the vault \u2014 no {{brand}}-owned app. It is escalate-by-default: the agent may only call a host a steward has signed onto the allowlist; any other host is refused and escalated, with no request made. The connector sets the Authorization header from the vaulted credential itself \u2014 the agent never sees the token, and the secret is redacted from the response before it reaches the agent, the audit row, or the logs. The token is only ever sent over HTTPS, only to the signed host, and a redirect is never followed \u2014 so an allowlisted endpoint cannot bounce the call (and the token) to another host. A sandbox dry run of a REST tool makes no real request.
42226
+
42227
+ ## One write-only credential flow across every surface
42228
+
42229
+ There is exactly one way to give a connected tool its credential, and it is the same on every surface (agent setup, Charter Builder, CLI, MCP). Connecting a tool only authorizes the access \u2014 it never captures a secret. When a connected tool needs a credential, you stage a vault-backed *request* (provider, scope, and a credential name \u2014 all labels, never the secret). You then provide the actual secret separately through the vault-backed ingress flow from Settings. No {{brand}} surface ever has a field that accepts raw secret material, so a secret can never reach a prompt, log, event, or tool argument.
42230
+
42177
42231
  ## What to check before connecting a tool
42178
42232
 
42179
42233
  - The seat has an active or ready-to-approve Charter.
@@ -42198,7 +42252,7 @@ Connecting a tool is a human-controlled step. The agent can recommend a tool, ex
42198
42252
  order: 47,
42199
42253
  title: "Available tools guide",
42200
42254
  summary: "How to think about tool categories available to seats and what each category should be used for.",
42201
- version: "2026-06-13.1",
42255
+ version: "2026-06-18.1",
42202
42256
  public: true,
42203
42257
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42204
42258
  stages: ["staffing"],
@@ -42234,14 +42288,20 @@ Start from the seat's responsibility, not the tool list. If a tool does not dire
42234
42288
 
42235
42289
  ## How agents should request tools
42236
42290
 
42237
- Agents should explain the job, the required tool category, the minimum permission needed, and the escalation boundary. Humans approve or decline the request.`
42291
+ Agents should explain the job, the required tool category, the minimum permission needed, and the escalation boundary. Humans approve or decline the request.
42292
+
42293
+ ## How a tool actually runs
42294
+
42295
+ Every tool call passes the server-side guard first: the guard checks the call against the seat's signed permission manifest and records a tool-call audit row for **every** call \u2014 allowed, denied, or escalated. Tool selection is never authorization. Only an allowed call reaches its handler. A connected credential is bound into the handler for the duration of the call only; the secret never appears in the result, the audit summary, logs, or the model's context.
42296
+
42297
+ External connectors (such as email, drive, or a generic API) are being rolled out provider by provider, conservatively (read and draft before send; write behind approval). Until a provider's connector is live, a tool you select is configuration only and has no external side effect \u2014 the guard and audit trail are already in force, so nothing runs silently.`
42238
42298
  },
42239
42299
  {
42240
42300
  slug: "mcp-and-cli-guide",
42241
42301
  order: 48,
42242
42302
  title: "CLI and MCP installation guide",
42243
42303
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42244
- version: "2026-06-18.10",
42304
+ version: "2026-06-19.4",
42245
42305
  public: true,
42246
42306
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42247
42307
  stages: ["company_setup", "staffing"],
@@ -42275,7 +42335,11 @@ Agents should explain the job, the required tool category, the minimum permissio
42275
42335
  "agent.configure_tools",
42276
42336
  "agent.run_dry_run",
42277
42337
  "agent.go_live",
42278
- "agent.status"
42338
+ "agent.status",
42339
+ "agent.list_fleet",
42340
+ "agent.get_run",
42341
+ "agent.list_runs",
42342
+ "agent.list_tool_calls"
42279
42343
  ],
42280
42344
  legal: {
42281
42345
  publicRisk: "low",
@@ -42648,10 +42712,10 @@ These ergonomic wrappers (including the \`{{cli}} agent\` group) require **{{cli
42648
42712
  | \`{{cli}} escalation list|get|resolve|reject\` | \`escalation.list\`, \`escalation.get\`, \`escalation.resolve\`, \`escalation.reject\` | Work the steward escalation queue. | Steward | \`{{cli}} escalation list --json\` |
42649
42713
  | \`{{cli}} sync brief|compile|complete\` | \`sync.brief.get\`, \`sync.brief.compile\`, \`sync.run.complete\` | Compile, read, and complete a weekly Sync. | Tenant | \`{{cli}} sync brief --json\` |
42650
42714
  | \`{{cli}} runner list|status|work-orders|revoke\` | \`runner.list\`, \`runner.status\`, \`work_order.list\`, \`runner.revoke\` | Inspect runners and work orders; revoke a runner. | Tenant | \`{{cli}} runner list --json\` |
42651
- | \`{{cli}} notification settings|test\` | \`notification.settings.get\`, \`notification.test\` | Read notification settings; send a test. | Tenant | \`{{cli}} notification settings --json\` |
42715
+ | \`{{cli}} 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 | \`{{cli}} notification errors --limit 10 --json\` |
42652
42716
  | \`{{cli}} settings get|update\` | \`settings.get\`, \`settings.update\` | Read tenant settings; update budget caps. | Tenant | \`{{cli}} settings get --json\` |
42653
42717
  | \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
42654
- | \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|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.show_markdown\` | Run the full agent setup 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, and show a markdown readout. 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 | \`{{cli}} agent templates --json\` |
42718
+ | \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|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.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, read one run's transcript/error diagnostics, and show a markdown readout. 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 | \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id> --json\` |
42655
42719
  | \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, credential requirement, access policy). Configuration only; the tools do not execute yet. | Tenant | \`{{cli}} tools list --json\` |
42656
42720
  | \`{{cli}} compass show\` | \`compass.show_markdown\` | Render the current Compass as a clean markdown card for review. | Tenant | \`{{cli}} compass show --markdown\` |
42657
42721
  | \`{{cli}} charter show\` | \`charter.show_markdown\` | Render a seat's Charter as a clean markdown card for review. | Tenant | \`{{cli}} charter show --seat-id <id> --markdown\` |
@@ -42748,6 +42812,11 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42748
42812
  | \`rost_get_current_compass\` | \`compass.get_current\` | Read the active and draft Compass versions and source documents. | Tenant | Call with \`{}\`. |
42749
42813
  | \`rost_list_compass_gaps\` | \`compass.list_gaps\` | List unanswered and answered Compass context gaps. | Tenant | Call with \`{}\` before answering gaps. |
42750
42814
  | \`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>"}\`. |
42815
+ | \`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. | Tenant | Call with \`{}\`; sandbox dry runs are excluded from real turns. |
42816
+ | \`rost_run_agent_now\` | \`agent.run_now\` | Queue an immediate run for a live staffed agent without changing its saved schedule; cloud lane dispatches to the executor and runner lane queues for the paired runner. | Tenant | Call with \`{"seat_id":"<seat-id>"}\`. |
42817
+ | \`rost_list_agent_runs\` | \`agent.list_runs\` | Read a seat's agent run history (status, lane, model, cost, per-run tool-call 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. |
42818
+ | \`rost_get_agent_run_diagnostics\` | \`agent.get_run\` | Read one run's diagnostic record: transcript reference, token/cost usage, outcome, and linked product-visible run errors. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>","run_id":"<run-id>"}\`. |
42819
+ | \`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. |
42751
42820
  | \`rost_list_agent_templates\` | \`agent_template.list\` | List stock agent templates and metadata. | Tenant | Call with \`{}\`. |
42752
42821
  | \`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. |
42753
42822
  | \`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. |
@@ -42771,7 +42840,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42771
42840
  | \`rost_get_notification_settings\` | \`notification.settings.get\` | Read tenant notification preferences. | Tenant | Call with \`{}\`. |
42772
42841
  | \`rost_update_notification_settings\` | \`notification.settings.update\` | Update tenant notification preferences. | Tenant | Call with the fields to change. |
42773
42842
  | \`rost_send_test_notification\` | \`notification.test\` | Emit an in-app test notification to the acting human. | Tenant | Call with \`{}\`. |
42774
- | \`rost_list_notification_errors\` | \`notification.list_errors\` | List recent failed notification deliveries. | Tenant | Call with optional \`limit\`. |
42843
+ | \`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\`. |
42775
42844
  | \`rost_invite_member\` | \`member.invite\` | Create a pending tenant invite for a human teammate. | Tenant | Call with \`email\` and \`role\`. |
42776
42845
  | \`rost_update_member_role\` | \`member.update\` | Change a tenant member's role. | Tenant | Call with \`member_id\` and \`role\`; expect human confirmation. |
42777
42846
  | \`rost_remove_member\` | \`member.remove\` | Remove a tenant member. | Tenant | Call with \`member_id\`; blocked if it would orphan an agent steward chain. |
@@ -42783,6 +42852,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42783
42852
  | \`rost_get_signal\` | \`signal.get\` | Read a measurable with its full reading history. | Seat or tenant-admin | Call with \`{"measurable_id":"<id>"}\`. |
42784
42853
  | \`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>"}\`. |
42785
42854
  | \`rost_correct_signal_reading\` | \`signal.correct_reading\` | Overwrite a reading with a human-confirmed value. | Seat or tenant-admin | Manual correction; expect confirmation. |
42855
+ | \`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"}\`. |
42786
42856
  | \`rost_list_cascade_goals\` | \`goal.list\` | List Cascade goals, optionally by cycle or seat. | Seat or tenant-admin | Call with \`{}\` or \`{"cycle_id":"<id>"}\`. |
42787
42857
  | \`rost_create_cascade_goal\` | \`goal.create\` | Create a cycle goal under an objective. | Tenant | Call with cycle, seat, parent, title, definition of done. |
42788
42858
  | \`rost_update_cascade_goal\` | \`goal.update\` | Update a goal's title or definition of done. | Tenant | Call with \`goal_id\` and the changed fields. |
@@ -42852,6 +42922,7 @@ These rows are quick, at-a-glance triage. For deeper auth, tenant, scope, confir
42852
42922
  - Revoked, **expired**, or invalid MCP token: run \`{{cli}} mcp install --client <client> --scope <tenant-admin|seat>\` again to mint and register a fresh one (a direct install requires \`--scope\`; or rotate the old token in place with \`--rotate <old-token-id>\`, which inherits its scope). Tokens minted by \`mcp install\` default to a 90-day expiry \u2014 check \`expires_in_days\` in \`{{cli}} command mcp_token.list\`; mint with \`--expires-in <days>\` or \`--no-expiry\` to change it.
42853
42923
  - Confirmation required: a human approves from the \`approveVia\` web link or runs the \`{{cli}} command confirmation.approve --json ...\` command shown in the CLI error output (an agent never approves its own request \u2014 see the confirmations-guide).
42854
42924
  - 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.
42925
+ - Inference budget hard cap reached (a run stops with a budget precondition error): raise the tenant hard cap with \`{{cli}} settings update --hard-cap-usd <amount>\` (command \`settings.update\`), then retry. A new company starts at a $0 hard cap, so managed-inference runs are blocked until it is set. The sandbox dry run is free and is never blocked by the cap, so you can charter, dry-run, and go live before setting a budget.
42855
42926
  - Need command guidance: run \`{{cli}} docs\`, \`{{cli}} reference search "onboarding"\`, or \`{{cli}} reference get agent-reference-map\`.
42856
42927
  - Need MCP guidance: call \`rost_reference_get\` with \`{"slug":"agent-reference-map"}\`.
42857
42928
  `
@@ -42914,7 +42985,11 @@ Never guess a command's JSON shape. Before calling a command that changes state,
42914
42985
  - List the tool catalog the agent builder reads (id, scope tiers, credential requirement, access policy \u2014 configuration only; the tools do not execute yet): {{cli}} tools list (CLI) or rost_list_tool_catalog (MCP)
42915
42986
  - Show a Compass, Charter, or agent setup as a markdown card to review with your human: {{cli}} compass show --markdown, {{cli}} charter show --seat-id <id> --markdown, {{cli}} agent show --seat-id <id> --markdown
42916
42987
 
42917
- When a command fails, the error returns a machine-readable code, a message, and a help field naming the exact command to run next. Read the help field and run the command it points at \u2014 do not retry the same call blindly. A failed precondition (for example a manifest not yet signed, or a dry run that has not passed) returns COMMAND_PRECONDITION_FAILED with a help pointer, not an opaque internal error.
42988
+ When a command fails, the error returns a machine-readable code, a message, and a help field naming the exact command to run next. Read the help field and run the command it points at \u2014 do not retry the same call blindly. A failed precondition (for example a manifest not yet signed, a dry run that has not passed, or the inference budget hard cap reached) returns COMMAND_PRECONDITION_FAILED with a help pointer, not an opaque internal error.
42989
+
42990
+ ## Inference budget
42991
+
42992
+ Agents that run on {{brand}}-managed inference draw against a tenant inference budget. A new company starts with a hard cap of $0, so a real managed-inference run is blocked until a human raises the cap with settings.update ({{cli}} settings update --hard-cap-usd <amount>). Hitting the cap returns a typed COMMAND_PRECONDITION_FAILED whose details.reason is budget.hard_cap_exceeded, with a help pointer naming that exact next command \u2014 not a generic internal error. The sandbox dry run is free and is never blocked by the cap, so an agent can be chartered, dry-run, and taken live before any budget is set; only real runs are gated. See settings-guide.
42918
42993
 
42919
42994
  ## Standard setup order
42920
42995
 
@@ -43045,7 +43120,7 @@ Agents can suggest commitments and report progress. They should not create a new
43045
43120
  order: 61,
43046
43121
  title: "Signal guide",
43047
43122
  summary: "How to define and read measurables so the company runs on evidence instead of status theater.",
43048
- version: "2026-06-18.1",
43123
+ version: "2026-06-18.2",
43049
43124
  public: true,
43050
43125
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43051
43126
  stages: ["operating_rhythm"],
@@ -43056,7 +43131,8 @@ Agents can suggest commitments and report progress. They should not create a new
43056
43131
  "signal.list",
43057
43132
  "signal.get",
43058
43133
  "signal.confirm_reading",
43059
- "signal.correct_reading"
43134
+ "signal.correct_reading",
43135
+ "measurable.create"
43060
43136
  ],
43061
43137
  legal: {
43062
43138
  publicRisk: "low",
@@ -43090,12 +43166,17 @@ Avoid vanity numbers, manual-only status fields, and metrics nobody can act on.
43090
43166
  ## Operate Signal from CLI or MCP
43091
43167
 
43092
43168
  - Read: \`{{cli}} signal list --json\` / \`signal.list\` / \`rost_list_signals\` returns measurables with their latest reading and on/off-track state. \`signal.get\` / \`rost_get_signal\` returns one measurable's full reading history.
43169
+ - Add a measurable: \`measurable.create\` (scope: seat) defines a measurable a seat owns \u2014 name, unit, direction, target, cadence. The seat owns it; readings attach to it afterward.
43093
43170
  - Record a reading: \`{{cli}} status record --measurable-id <id> --value <n>\` (\`status.record\`, scope: seat) writes a status event with the reading. This is not gated.
43094
43171
  - Confirm a reading: \`{{cli}} signal confirm\` / \`signal.confirm_reading\` / \`rost_confirm_signal_reading\` marks a reading human-verified. \`signal.correct_reading\` / \`rost_correct_signal_reading\` overwrites a reading with a human-confirmed value.
43095
43172
 
43173
+ ## Run Signal without an agent
43174
+
43175
+ A human can run the whole loop from the Signal page. Each measurable has a "Log this period's number" control that records a human reading (the same \`signal.correct_reading\` path), and an "Add a measurable" form creates one against a seat (the \`measurable.create\` path). You do not need an agent to keep Signal current.
43176
+
43096
43177
  ## When to stop for confirmation
43097
43178
 
43098
- \`signal.correct_reading\` is \`human_required\`; overwriting a recorded measurable is a human judgment. \`signal.confirm_reading\` is \`none\`, so a seat can confirm its own readings directly. An agent records readings with evidence; a human corrects when a value is wrong.
43179
+ \`signal.correct_reading\` is \`human_required\`; overwriting a recorded measurable is a human judgment. \`signal.confirm_reading\` is \`none\`, so a seat can confirm its own readings directly. \`measurable.create\` is \`none\` \u2014 defining a measurable is not gated. An agent records readings with evidence; a human corrects when a value is wrong.
43099
43180
 
43100
43181
  ## Agent guidance
43101
43182
 
@@ -43176,7 +43257,7 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
43176
43257
  order: 70,
43177
43258
  title: "Steward queue guide",
43178
43259
  summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
43179
- version: "2026-06-18.1",
43260
+ version: "2026-06-18.2",
43180
43261
  public: true,
43181
43262
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43182
43263
  stages: ["staffing", "operating_rhythm"],
@@ -43211,6 +43292,8 @@ A Steward is the human accountable for an agent seat. The Steward queue is where
43211
43292
 
43212
43293
  Read the seat, Charter, evidence, and recommended action. Decide the narrow question first. If the same escalation repeats, revise the Charter rather than answering the same question forever.
43213
43294
 
43295
+ In the app, the evidence is shown as a legible card, not raw data: a proposed tool call lists the tool and its summarized arguments, and any attached context shows as labeled fields. Values that read like credentials are redacted, so you can decide without seeing secret material.
43296
+
43214
43297
  ## Work the queue from CLI or MCP
43215
43298
 
43216
43299
  The Steward reads the queue from any surface but decides as a human.
@@ -43287,7 +43370,7 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
43287
43370
  order: 72,
43288
43371
  title: "Settings guide",
43289
43372
  summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
43290
- version: "2026-06-16.1",
43373
+ version: "2026-06-18.1",
43291
43374
  public: true,
43292
43375
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43293
43376
  stages: ["company_setup", "staffing"],
@@ -43323,6 +43406,14 @@ Start with members and invites, then provider and channel connections, then MCP
43323
43406
 
43324
43407
  The weekly Sync Brief compiles either company-wide or per cluster. Company-wide is one brief covering the whole company and is the default for a new company. Per cluster compiles one brief per cluster, scoped to each cluster's seats; pick it when clusters run their own weekly sync. Per cluster falls back to a single company-wide brief when the company has no clusters, so the rhythm never produces zero briefs. The owner sets this at onboarding and can change it later in Settings.
43325
43408
 
43409
+ ## Inference budget
43410
+
43411
+ Agents that run on {{brand}}-managed inference draw against a tenant inference budget with a hard cap. A new company starts with a hard cap of $0, so a managed-inference run is blocked until the cap is raised. When a run hits the cap it stops with a typed budget error that names the fix; raise the cap before agents can run again.
43412
+
43413
+ - Set the hard cap with \`settings.update\` (CLI: \`{{cli}} settings update --hard-cap-usd <amount>\`). The optional soft cap warns before the hard cap and must be less than or equal to it.
43414
+ - The sandbox dry run is free and is never blocked by the cap, so a fresh company can charter, dry-run, and take an agent live before setting a budget. The cap applies only to real managed-inference runs.
43415
+ - A company that brings its own provider key (BYOK) is metered on that key and is not subject to the {{brand}}-managed hard cap.
43416
+
43326
43417
  ## Agent guidance
43327
43418
 
43328
43419
  Agents may explain which setting is needed and why. They should not ask users to paste secrets into chat or tool arguments. When credentials are required, route the user to the vault-backed setup flow.`
@@ -43366,7 +43457,7 @@ When a user asks to add a person, clarify whether they mean app access, seat occ
43366
43457
  order: 74,
43367
43458
  title: "Notifications guide",
43368
43459
  summary: "How {{brand}} should notify humans about decisions, escalations, stale work, and agent boundaries.",
43369
- version: "2026-06-13.1",
43460
+ version: "2026-06-19.1",
43370
43461
  public: true,
43371
43462
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43372
43463
  stages: ["operating_rhythm"],
@@ -43391,6 +43482,10 @@ Notifications should move decisions to the right human without turning {{brand}}
43391
43482
  - A Friction item needs a decision.
43392
43483
  - A Sync decision creates a handoff.
43393
43484
 
43485
+ ## Diagnose failed deliveries
43486
+
43487
+ \`{{cli}} notification errors --limit 10\` / \`notification.list_errors\` / \`rost_list_notification_errors\` returns recent failed deliveries. When a failed notification links to a product error, it includes \`error_log_id\`, \`source\`, and any linked \`seat_id\` / \`run_id\`; \`source=run\` means the notification is tied to an agent run and can be followed with \`agent.get_run\` for the transcript reference and run errors.
43488
+
43394
43489
  ## Keep notifications useful
43395
43490
 
43396
43491
  Every notification should include the seat, cause, evidence, and requested decision. Avoid status-only messages when no action is needed.`
@@ -43400,7 +43495,7 @@ Every notification should include the seat, cause, evidence, and requested decis
43400
43495
  order: 75,
43401
43496
  title: "Local runner guide",
43402
43497
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
43403
- version: "2026-06-18.1",
43498
+ version: "2026-06-19.2",
43404
43499
  public: true,
43405
43500
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43406
43501
  stages: ["staffing", "operating_rhythm"],
@@ -43430,12 +43525,22 @@ The local runner is for human-controlled local agent work. It should retrieve {{
43430
43525
 
43431
43526
  - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code.
43432
43527
  - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows online/offline/revoked state; \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner.
43433
- - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`.
43528
+ - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent, or use \`agent.run_now\` / \`rost_run_agent_now\` when an operator wants the product to queue and dispatch an immediate live run from a seat id; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`.
43434
43529
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
43435
43530
 
43531
+ ## Owner-initiated headless pairing
43532
+
43533
+ Use this flow when a headless or desktop runner cannot use the interactive web confirmation flow.
43534
+
43535
+ 1. The owner runs \`runner.pairing.start\` or \`rost_start_runner_pairing\` with the runner \`name\` and \`platform\`.
43536
+ 2. The owner gives the returned \`user_code\` to the runner through a trusted out-of-band channel.
43537
+ 3. The runner calls \`POST /api/runner/pairing/claim\` with \`{"user_code":"ABCD-2345"}\`.
43538
+ 4. The response returns \`runner_id\`, \`runner_secret\`, \`name\`, and \`platform\`. Store the runner secret only on the runner machine.
43539
+ 5. The runner sends heartbeats with \`Authorization: Bearer <runner_secret>\` and then claims work orders.
43540
+
43436
43541
  ## When to stop for confirmation
43437
43542
 
43438
- \`runner.revoke\` and \`work_order.cancel\` are \`human_required\`; \`runner.pairing.start\` and \`work_order.enqueue\` are \`none\`, so an operator can pair a runner and queue work directly. List and status reads are not gated. Revoking a runner or cancelling work is the human-approved act. An agent inspects runner state and proposes the action.
43543
+ \`runner.revoke\` and \`work_order.cancel\` are \`human_required\`; \`runner.pairing.start\`, \`work_order.enqueue\`, and \`agent.run_now\` are \`none\`, so an operator can pair a runner and queue work directly. List and status reads are not gated. Revoking a runner or cancelling work is the human-approved act. An agent inspects runner state and proposes the action.
43439
43544
 
43440
43545
  ## Guardrails
43441
43546
 
@@ -44907,6 +45012,17 @@ function optionalValue(parsed, key) {
44907
45012
  const value = parsed.values.get(key);
44908
45013
  return value === void 0 || value.length === 0 ? void 0 : value;
44909
45014
  }
45015
+ function optionalNumber(parsed, key) {
45016
+ const raw = optionalValue(parsed, key);
45017
+ if (raw === void 0) {
45018
+ return void 0;
45019
+ }
45020
+ const parsedNumber = Number(raw);
45021
+ if (!Number.isSafeInteger(parsedNumber)) {
45022
+ throw new UsageError(`--${key} must be an integer.`);
45023
+ }
45024
+ return parsedNumber;
45025
+ }
44910
45026
  function parseNumber(parsed, key, options) {
44911
45027
  const raw = parsed.values.get(key);
44912
45028
  if (raw === void 0 || raw.length === 0) {
@@ -45509,12 +45625,27 @@ var notificationWrapper = (context, args) => dispatch(context, "notification", a
45509
45625
  const record2 = asRecord(output);
45510
45626
  return `Test notification ${field(record2, "notification_id")} (delivered=${field(record2, "delivered")}).`;
45511
45627
  });
45628
+ },
45629
+ errors: (ctx, rest) => {
45630
+ const parsed = parseFlags(rest);
45631
+ const body = withOptional({}, { limit: optionalNumber(parsed, "limit") });
45632
+ return execute(ctx, parsed, "notification.list_errors", body, (output) => {
45633
+ const errors = asArray(asRecord(output).errors);
45634
+ if (errors.length === 0) {
45635
+ return "No failed notification deliveries.";
45636
+ }
45637
+ return errors.map((entry) => {
45638
+ const record2 = asRecord(entry);
45639
+ return `${field(record2, "created_at")} ${field(record2, "channel")} source=${field(record2, "source")} seat=${field(record2, "seat_id")} run=${field(record2, "run_id")} ${field(record2, "error_message")}`;
45640
+ }).join("\n");
45641
+ });
45512
45642
  }
45513
45643
  }, notificationUsage(context.binName));
45514
45644
  function notificationUsage(bin) {
45515
- return `Usage: ${bin} notification settings|test [--json]
45645
+ return `Usage: ${bin} notification settings|test|errors [--json]
45516
45646
  ${bin} notification settings
45517
- ${bin} notification test`;
45647
+ ${bin} notification test
45648
+ ${bin} notification errors [--limit <n>]`;
45518
45649
  }
45519
45650
  var settingsWrapper = (context, args) => dispatch(context, "settings", args, {
45520
45651
  get: (ctx, rest) => {
@@ -45705,6 +45836,31 @@ ${field(record2, "summary")}`;
45705
45836
  return `agent seat ${field(record2, "seat_id")} status=${field(record2, "status")} live=${field(record2, "live")} lane=${field(record2, "lane")}`;
45706
45837
  });
45707
45838
  },
45839
+ "run-now": (ctx, rest) => {
45840
+ const parsed = parseFlags(rest);
45841
+ const body = withOptional({ seat_id: requireValue2(parsed, "seat-id") }, {
45842
+ task_id: optionalValue(parsed, "task-id")
45843
+ });
45844
+ return execute(ctx, parsed, "agent.run_now", body, (output) => {
45845
+ const workOrder = asRecord(asRecord(output).work_order);
45846
+ return `queued ${field(workOrder, "lane")} work order ${field(workOrder, "id")} for agent ${field(workOrder, "agent_id")} (${field(workOrder, "status")})`;
45847
+ });
45848
+ },
45849
+ "get-run": (ctx, rest) => {
45850
+ const parsed = parseFlags(rest);
45851
+ const body = {
45852
+ seat_id: requireValue2(parsed, "seat-id"),
45853
+ run_id: requireValue2(parsed, "run-id")
45854
+ };
45855
+ return execute(ctx, parsed, "agent.get_run", body, (output) => {
45856
+ const run2 = asRecord(asRecord(output).run);
45857
+ const errors = asArray(run2.error_logs);
45858
+ const errorLine = errors.length === 0 ? "errors=0" : `errors=${errors.length} first=${field(asRecord(errors[0]), "message")}`;
45859
+ return `run ${field(run2, "run_id")} status=${field(run2, "status")} lane=${field(run2, "lane")} cost=$${field(run2, "cost_usd")}
45860
+ transcript=${field(run2, "transcript_ref")}
45861
+ ${errorLine}`;
45862
+ });
45863
+ },
45708
45864
  // DER-787 (H8): markdown readout for a seat's agent setup. `--markdown` (or
45709
45865
  // default) prints the composed card; `--json` returns the { markdown } object.
45710
45866
  show: (ctx, rest) => {
@@ -45731,7 +45887,7 @@ function agentConfigureTools(ctx, rest, decision) {
45731
45887
  });
45732
45888
  }
45733
45889
  function agentUsage(bin) {
45734
- return `Usage: ${bin} agent templates|create|setup|tools|dry-run|go-live|status|show [--json]
45890
+ return `Usage: ${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|get-run|show [--json]
45735
45891
  ${bin} agent templates
45736
45892
  ${bin} agent create --seat-id <id> --template <slug> [--expected-version <v>]
45737
45893
  ${bin} agent create --seat-id <id> --custom [--steward-seat-id <id>] [--lane cloud|mcp_session|runner] [--model triage|balanced|complex|hardest|<id>] [--effort low|medium|high|xhigh|max] [--owns <text>] [--success <text>] [--never-alone <text>]
@@ -45741,6 +45897,8 @@ function agentUsage(bin) {
45741
45897
  ${bin} agent dry-run --seat-id <id> --charter-version-id <id>
45742
45898
  ${bin} agent go-live --seat-id <id> --charter-version-id <id>
45743
45899
  ${bin} agent status --seat-id <id>
45900
+ ${bin} agent run-now --seat-id <id> [--task-id <id>]
45901
+ ${bin} agent get-run --seat-id <id> --run-id <id>
45744
45902
  ${bin} agent show --seat-id <id> [--markdown]`;
45745
45903
  }
45746
45904
  function agentSetupUsage(bin) {
@@ -45879,10 +46037,10 @@ function operationUsageLines(bin) {
45879
46037
  `${bin} escalation list|get|resolve|reject`,
45880
46038
  `${bin} sync brief|compile|complete`,
45881
46039
  `${bin} runner list|status|work-orders|revoke`,
45882
- `${bin} notification settings|test`,
46040
+ `${bin} notification settings|test|errors`,
45883
46041
  `${bin} settings get|update`,
45884
46042
  `${bin} member invite|update|remove`,
45885
- `${bin} agent templates|create|setup|tools|dry-run|go-live|status|show`,
46043
+ `${bin} agent templates|create|setup|tools|dry-run|go-live|status|run-now|get-run|show`,
45886
46044
  `${bin} tools list`,
45887
46045
  `${bin} compass show`,
45888
46046
  `${bin} charter show`