@rosthq/cli 0.5.16 → 0.5.18

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
@@ -41830,7 +41830,7 @@ Drafting can be assisted by agents. Activation is a human decision. When authori
41830
41830
  order: 40,
41831
41831
  title: "Agent staffing playbook",
41832
41832
  summary: "How to decide whether a seat should be human, agent, or hybrid, and how to go live safely.",
41833
- version: "2026-06-19.2",
41833
+ version: "2026-06-20.1",
41834
41834
  public: true,
41835
41835
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41836
41836
  stages: ["staffing"],
@@ -41891,6 +41891,12 @@ Two creation paths, both draft-first. Read the stock-agents guide for templates
41891
41891
  - 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.
41892
41892
  - 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.
41893
41893
 
41894
+ ## Review readiness before go-live
41895
+
41896
+ The fleet page and seat page should make readiness inspectable, not implied. A staffed agent row shows whether the Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state are complete. Each missing item links to the exact setup surface that fixes it: seat staffing, the Charter Builder, agent operations, runner settings, vault settings, or tool configuration.
41897
+
41898
+ After an agent runs, review its completed work as well as its telemetry. Seat pages combine explicit deliverables, work-log evidence, and successful run summaries into a readable output trail with safe evidence links labelled as internal, Linear, GitHub, or external. Held confirmations and escalations remain visible until decided or expired: confirmations can be approved or rejected from the seat page, while escalations link to the Steward queue for the human decision.
41899
+
41894
41900
  ## When to stop for confirmation
41895
41901
 
41896
41902
  \`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.
@@ -42133,7 +42139,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42133
42139
  order: 45,
42134
42140
  title: "How agents work",
42135
42141
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
42136
- version: "2026-06-20.3",
42142
+ version: "2026-06-20.4",
42137
42143
  public: true,
42138
42144
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42139
42145
  stages: ["staffing", "operating_rhythm"],
@@ -42225,20 +42231,20 @@ Before an agent goes live, the sandbox dry run rehearses this against fake data
42225
42231
 
42226
42232
  ## What humans should review
42227
42233
 
42228
- The Agents page shows fleet health first: live state, recent runs, failed runs, open held actions, last activity, cost, and the next operator action. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason.
42234
+ The Agents page shows fleet health first: live state, recent runs, failed runs, open held actions, last activity, cost, and the next operator action. It also shows configuration completeness for each staffed agent seat: Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state, each with a remediation link when incomplete. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason.
42229
42235
 
42230
- 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 equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. 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.`
42236
+ Review the first dry runs, fleet overview, tool-call audit rows, escalations, deliverables, and Signal impact. A seat's completed-work area combines explicit deliverables, work-log evidence, and successful run summaries into one operator-facing trail with safe links labelled as internal, Linear, GitHub, or external. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. 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.`
42231
42237
  },
42232
42238
  {
42233
42239
  slug: "tool-access-and-vault",
42234
42240
  order: 46,
42235
42241
  title: "Tool access and vault",
42236
42242
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
42237
- version: "2026-06-20.4",
42243
+ version: "2026-06-20.5",
42238
42244
  public: true,
42239
42245
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42240
42246
  stages: ["staffing"],
42241
- relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.list", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
42247
+ relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
42242
42248
  legal: {
42243
42249
  publicRisk: "low",
42244
42250
  notes: [
@@ -42288,6 +42294,8 @@ Google can be connected from Settings once the workspace OAuth app is configured
42288
42294
 
42289
42295
  CLI and MCP can inspect connector readiness without seeing secrets: \`integration.list\` / \`rost_list_integrations\` lists connected providers and health metadata, \`integration.status\` / \`rost_get_integration_status\` reads one provider by id or name, and \`integration.test\` / \`rost_test_integration_connection\` runs the installed provider-specific health check. For Google, the test refreshes the vaulted OAuth credential and reads the Gmail profile, then records only account, scope, and health metadata.
42290
42296
 
42297
+ \`integration.readiness\` / \`{{cli}} integration readiness --provider google --json\` / \`rost_check_integration_readiness\` returns the same setup checklist Settings shows: OAuth env and callback status, tenant connection state, granted scopes, latest test state, external verification/CASA caveats, handler availability, and the next Linear issue or action. The checklist is metadata-only. It never returns access tokens, refresh tokens, client secrets, vault refs, or raw provider responses.
42298
+
42291
42299
  ## One write-only credential flow across every surface
42292
42300
 
42293
42301
  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.
@@ -42370,7 +42378,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42370
42378
  order: 48,
42371
42379
  title: "CLI and MCP installation guide",
42372
42380
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42373
- version: "2026-06-20.10",
42381
+ version: "2026-06-20.12",
42374
42382
  public: true,
42375
42383
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42376
42384
  stages: ["company_setup", "staffing"],
@@ -42409,7 +42417,11 @@ External connectors are being rolled out provider by provider, conservatively (r
42409
42417
  "agent.fleet_digest",
42410
42418
  "agent.get_run",
42411
42419
  "agent.list_runs",
42412
- "agent.list_tool_calls"
42420
+ "agent.list_tool_calls",
42421
+ "integration.list",
42422
+ "integration.readiness",
42423
+ "integration.status",
42424
+ "integration.test"
42413
42425
  ],
42414
42426
  legal: {
42415
42427
  publicRisk: "low",
@@ -42783,12 +42795,13 @@ These ergonomic wrappers (including the \`{{cli}} agent\` group) require **{{cli
42783
42795
  | \`{{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\` |
42784
42796
  | \`{{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\` |
42785
42797
  | \`{{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\` |
42786
- | \`{{cli}} integration list|status|test\` | \`integration.list\`, \`integration.status\`, \`integration.test\` | List connector metadata, read one connector's health, and run the provider-specific connection test without exposing credentials. | Tenant | \`{{cli}} integration test --provider google --json\` |
42798
+ | \`{{cli}} integration list|readiness|status|test\` | \`integration.list\`, \`integration.readiness\`, \`integration.status\`, \`integration.test\` | List connector metadata, read the setup-readiness checklist, read one connector's health, and run the provider-specific connection test without exposing credentials. | Tenant | \`{{cli}} integration readiness --provider google --json\` |
42787
42799
  | \`{{cli}} settings get|update\` | \`settings.get\`, \`settings.update\` | Read tenant settings; update budget caps. | Tenant | \`{{cli}} settings get --json\` |
42788
42800
  | \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
42789
42801
  | \`{{cli}} 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. 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 fleet-digest --json\` |
42790
42802
  | \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, credential requirement, access policy, and execution-boundary guidance). | Tenant | \`{{cli}} tools list --json\` |
42791
42803
  | \`{{cli}} 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 and seat | \`{{cli}} skills list --json\`; \`{{cli}} skills file --slug invoice-review --path SKILL.md\` |
42804
+ | \`{{cli}} 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 or approve 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 and seat | \`{{cli}} skills import github --url https://github.com/acme/skills/tree/main/ap --json\`; \`{{cli}} skills assign --seat-id <id> --slug invoice-review --json\` |
42792
42805
  | \`{{cli}} model list\` | \`model.catalog\` | List guided model tiers with recommendations, token prices, cost bands, best-fit work, and model ids for \`--model\`. | Tenant | \`{{cli}} model list --json\` |
42793
42806
  | \`{{cli}} compass show\` | \`compass.show_markdown\` | Render the current Compass as a clean markdown card for review. | Tenant | \`{{cli}} compass show --markdown\` |
42794
42807
  | \`{{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\` |
@@ -42917,6 +42930,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42917
42930
  | \`rost_send_test_notification\` | \`notification.test\` | Emit an in-app test notification to the acting human. | Tenant | Call with \`{}\`. |
42918
42931
  | \`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\`. |
42919
42932
  | \`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. |
42933
+ | \`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. |
42920
42934
  | \`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>"}\`. |
42921
42935
  | \`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. |
42922
42936
  | \`rost_invite_member\` | \`member.invite\` | Create a pending tenant invite for a human teammate. | Tenant | Call with \`email\` and \`role\`. |
@@ -42958,6 +42972,13 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
42958
42972
  | \`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"}\`. |
42959
42973
  | \`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>"}\`. |
42960
42974
  | \`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"}\`. |
42975
+ | \`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"}\`. |
42976
+ | \`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":"..."}]}}\`. |
42977
+ | \`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"}\`. |
42978
+ | \`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"}\`. |
42979
+ | \`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. |
42980
+ | \`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."}\`. |
42981
+ | \`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. |
42961
42982
  | \`rost_list_model_catalog\` | \`model.catalog\` | List guided model tiers \u2014 recommendations, token prices, cost bands, best-fit work, and model ids for \`--model\`. | Tenant | Call with \`{}\`. |
42962
42983
 
42963
42984
  ### Seat-scoped operating tools
@@ -43144,7 +43165,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
43144
43165
  order: 60,
43145
43166
  title: "Cascade guide",
43146
43167
  summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
43147
- version: "2026-06-20.1",
43168
+ version: "2026-06-20.2",
43148
43169
  public: true,
43149
43170
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43150
43171
  stages: ["operating_rhythm"],
@@ -43197,6 +43218,10 @@ Cascade warnings are advisory, not blockers. They point to setup that should be
43197
43218
  - Agent goal missing human accountability parent: an agent-owned goal has no human or hybrid goal in its ancestry.
43198
43219
  - Orphaned goal branch: the owner seat or parent chain no longer reaches an active Compass objective.
43199
43220
 
43221
+ On \`/cascade\`, the screen renders the full goal depth, not just one or two levels. Off-track descendant branches stay open so the operator can see why a parent rolled up to risk.
43222
+
43223
+ On human and function seat pages, goal visibility includes both direct goals and descendant seat goals from the Responsibility Graph subtree, so a manager can review team progress without double-owning the agent's work.
43224
+
43200
43225
  ## What does not belong
43201
43226
 
43202
43227
  Do not put every task into Cascade. Small errands, private notes, and work with no strategic connection should stay out. Cascade should answer whether the company is moving toward its stated outcomes.
@@ -43288,7 +43313,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
43288
43313
  order: 62,
43289
43314
  title: "Friction guide",
43290
43315
  summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
43291
- version: "2026-06-18.1",
43316
+ version: "2026-06-20.1",
43292
43317
  public: true,
43293
43318
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43294
43319
  stages: ["operating_rhythm"],
@@ -43337,6 +43362,8 @@ Friction is where operational issues become visible. A good Friction item is spe
43337
43362
 
43338
43363
  Agents should file Friction when a measurable breaks, a tool fails, a repeated exception appears, or the Charter says a condition must be escalated. The agent should attach evidence and avoid deciding beyond its scope.
43339
43364
 
43365
+ In the app, operational evidence is summarized for humans instead of shown as the primary interface. Incident fields, proposed tool calls, schedules, payload labels, and source links render as readable fields with raw details tucked behind supporting context when useful. Secret-shaped values stay redacted.
43366
+
43340
43367
  ## Operate Friction, tasks, and escalations from CLI or MCP
43341
43368
 
43342
43369
  Friction, tasks, and escalations are the issue-to-action loop. A seat files, a task carries the work, and an escalation routes a decision a seat cannot make alone.
@@ -43358,7 +43385,7 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
43358
43385
  order: 70,
43359
43386
  title: "Steward queue guide",
43360
43387
  summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
43361
- version: "2026-06-18.2",
43388
+ version: "2026-06-20.1",
43362
43389
  public: true,
43363
43390
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43364
43391
  stages: ["staffing", "operating_rhythm"],
@@ -43395,6 +43422,8 @@ Read the seat, Charter, evidence, and recommended action. Decide the narrow ques
43395
43422
 
43396
43423
  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.
43397
43424
 
43425
+ When nothing is waiting, the Steward page still proves the governance loop. It shows which agent or hybrid seats the human stewards, how many escalations were raised or decided recently, and whether any are open. That empty state is an operating summary, not a dead end.
43426
+
43398
43427
  ## Work the queue from CLI or MCP
43399
43428
 
43400
43429
  The Steward reads the queue from any surface but decides as a human.
@@ -43471,11 +43500,11 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
43471
43500
  order: 72,
43472
43501
  title: "Settings guide",
43473
43502
  summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
43474
- version: "2026-06-20.5",
43503
+ version: "2026-06-20.7",
43475
43504
  public: true,
43476
43505
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43477
43506
  stages: ["company_setup", "staffing"],
43478
- relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.status", "integration.test", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
43507
+ relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
43479
43508
  legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
43480
43509
  sources: [
43481
43510
  {
@@ -43505,11 +43534,11 @@ Start with members and invites, then provider and channel connections, then MCP
43505
43534
 
43506
43535
  Settings lifecycle timestamps are display metadata for tokens, connected machines, integrations, and stored credentials. They may be emitted by the database as either timestamp values or strings, but Settings renders them as safe labels rather than treating timestamp formatting failures as page-level failures.
43507
43536
 
43508
- When a settings source is temporarily unavailable, the app keeps the route open and marks affected sections as unavailable instead of showing raw errors or stale-looking editable values. Budget and Sync Brief controls stay read-only until their server-backed data can be loaded.
43537
+ When a settings source is temporarily unavailable, the app keeps the route open and marks affected sections as unavailable instead of showing raw errors or stale-looking editable values. Budget and Sync Brief controls stay read-only until their server-backed data can be loaded. Notification timestamps and integration test timestamps follow the same safe-label rule, so a malformed or missing timestamp becomes \`Unknown\` or unavailable copy rather than a page crash.
43509
43538
 
43510
43539
  ## Integration health
43511
43540
 
43512
- \`integration.list\` lists connector metadata for CLI and MCP operators, \`integration.status\` reads one provider or integration id, and \`integration.test\` runs the installed provider-specific health check. These commands return account labels, scopes, capabilities, timestamps, and health only; they never return vault references, access tokens, refresh tokens, or raw provider responses. Google's test refreshes the vaulted OAuth credential and reads the Gmail profile as the minimal live check. Settings exposes the same Google test as an owner/operator button beside Connect/Reconnect, shows the last tested time, and turns failures into reconnect-oriented remediation copy rather than raw provider errors.
43541
+ \`integration.list\` lists connector metadata for CLI and MCP operators, \`integration.readiness\` returns the setup checklist, \`integration.status\` reads one provider or integration id, and \`integration.test\` runs the installed provider-specific health check. These commands return account labels, scopes, capabilities, timestamps, checklist status, DER-coded next actions, and health only; they never return vault references, access tokens, refresh tokens, client secrets, or raw provider responses. Google's test refreshes the vaulted OAuth credential and reads the Gmail profile as the minimal live check. Settings exposes the same Google readiness facts and test action beside Connect/Reconnect, showing whether OAuth env, callback registration, tenant connection, scopes, tests, Google verification/CASA, and Gmail/Sheets handler slices are ready or still waiting on DER-880, DER-881, DER-866, DER-867, or DER-869.
43513
43542
 
43514
43543
  Reconnects keep historical rows for audit, but provider status in Settings, CLI, and MCP prefers the current connected row first, then the latest error or disconnected row.
43515
43544
 
@@ -43772,7 +43801,7 @@ Templates may draft. Humans approve. A stock agent should not go live until a hu
43772
43801
  order: 77,
43773
43802
  title: "Troubleshooting guide",
43774
43803
  summary: "How users and agents should diagnose common setup, tool, Signal, Friction, and MCP problems.",
43775
- version: "2026-06-18.4",
43804
+ version: "2026-06-20.1",
43776
43805
  public: true,
43777
43806
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43778
43807
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -43805,10 +43834,12 @@ Before calling a command that changes state, discover its exact shape so you do
43805
43834
  - Onboarding seems stuck: call \`onboarding.status\` / \`rost_onboard_status\` and inspect missing graph, Charter, Compass, or staffing steps.
43806
43835
  - Graph looks wrong: read \`graph.get\` / \`rost://graph\` to confirm seat ids, parents, and occupancy before mutating.
43807
43836
  - Agent cannot act: check the Charter, permission manifest, Steward chain, and token scope with \`agent.status\` / \`rost_get_agent_status\` and \`seat.get\`.
43837
+ - Agent looks incomplete: open the fleet row on \`/agents\` and follow the configuration readiness links for the missing Steward chain, lane/substrate, credentials, tools, model config, sandbox dry run, or go-live state.
43808
43838
  - Signal looks wrong: read \`signal.list\` / \`rost_list_signals\` and check owner seat, cadence, target, and evidence.
43809
43839
  - Friction is noisy: read \`friction.list\` and check whether the underlying Charter or measurable is unclear.
43810
43840
  - Escalations are aging: read \`escalation.list\` / \`rost_list_escalations\`; a human resolves through the Steward queue.
43811
43841
  - MCP access fails: revoke and recreate the narrowest token after checking scope (\`mcp_token.revoke\` then \`{{cli}} mcp install --client <client> --scope seat --seat-id <seat-id>\`; standalone \`mcp install\` requires an explicit \`--scope\`).
43842
+ - Settings section unavailable: keep the route open, read which section is marked unavailable, and retry or fix that source directly. Do not treat a missing Settings panel as permission to write blind values; budget and Sync Brief settings stay read-only until their data loads.
43812
43843
 
43813
43844
  ## Surface-specific failures
43814
43845
 
@@ -45074,6 +45105,7 @@ function parseSemver(value) {
45074
45105
  }
45075
45106
 
45076
45107
  // src/operations.ts
45108
+ import { readFileSync as readFileSync2 } from "node:fs";
45077
45109
  var UsageError = class extends Error {
45078
45110
  };
45079
45111
  function parseFlags(args, booleanFlags = /* @__PURE__ */ new Set()) {
@@ -45775,6 +45807,17 @@ var integrationWrapper = (context, args) => dispatch(context, "integration", arg
45775
45807
  return integrations.map((entry) => formatIntegrationLine(asRecord(entry))).join("\n");
45776
45808
  });
45777
45809
  },
45810
+ readiness: (ctx, rest) => {
45811
+ const parsed = parseFlags(rest);
45812
+ const body = withOptional({}, { provider: optionalValue(parsed, "provider") });
45813
+ return execute(ctx, parsed, "integration.readiness", body, (output) => {
45814
+ const connectors = asArray(asRecord(output).connectors);
45815
+ if (connectors.length === 0) {
45816
+ return "No connector readiness facts found.";
45817
+ }
45818
+ return connectors.map((entry) => formatIntegrationReadiness(asRecord(entry))).join("\n\n");
45819
+ });
45820
+ },
45778
45821
  status: (ctx, rest) => {
45779
45822
  const parsed = parseFlags(rest);
45780
45823
  const body = integrationLookupBody(parsed);
@@ -45808,9 +45851,24 @@ function integrationLookupBody(parsed) {
45808
45851
  function formatIntegrationLine(record2) {
45809
45852
  return `${field(record2, "provider")} status=${field(record2, "status")} account=${field(record2, "account_email")} last_test=${field(record2, "last_test_result")} id=${field(record2, "id")}`;
45810
45853
  }
45854
+ function formatIntegrationReadiness(record2) {
45855
+ const checks = asArray(record2.checks).map((entry) => {
45856
+ const check2 = asRecord(entry);
45857
+ const issue2 = field(check2, "linear_issue") === "\u2014" ? "" : ` ${field(check2, "linear_issue")}`;
45858
+ return ` - ${field(check2, "label")}: ${field(check2, "status")}${issue2} \u2014 ${field(check2, "detail")}`;
45859
+ });
45860
+ const actions = asArray(record2.next_actions).map((entry) => ` - ${String(entry)}`);
45861
+ return [
45862
+ `${field(record2, "provider")} readiness=${field(record2, "overall_status")} id=${field(record2, "integration_id")}`,
45863
+ field(record2, "summary"),
45864
+ checks.length > 0 ? ["checks:", ...checks].join("\n") : "",
45865
+ actions.length > 0 ? ["next:", ...actions].join("\n") : ""
45866
+ ].filter((line) => line.length > 0).join("\n");
45867
+ }
45811
45868
  function integrationUsage(bin) {
45812
- return `Usage: ${bin} integration list|status|test [--json]
45869
+ return `Usage: ${bin} integration list|readiness|status|test [--json]
45813
45870
  ${bin} integration list [--provider <name>]
45871
+ ${bin} integration readiness [--provider google]
45814
45872
  ${bin} integration status --provider <name>
45815
45873
  ${bin} integration test --provider <name>`;
45816
45874
  }
@@ -46192,7 +46250,89 @@ function formatDependencyCheck(output) {
46192
46250
  render("optional", asArray(record2.optional))
46193
46251
  ].join("\n");
46194
46252
  }
46253
+ function packageFromSkillFile(filePath) {
46254
+ return {
46255
+ files: [{ path: "SKILL.md", content: readFileSync2(filePath, "utf8") }]
46256
+ };
46257
+ }
46258
+ function formatSkillWrite(label) {
46259
+ return (output) => {
46260
+ const skill = asRecord(asRecord(output).skill);
46261
+ const warnings = asArray(asRecord(skill.validation).warnings).length;
46262
+ return [
46263
+ `${label}: \`${field(skill, "slug")}\` v${field(skill, "version")} (${field(skill, "skill_version_id")})`,
46264
+ `status: ${field(skill, "status")}`,
46265
+ `content_sha256: ${field(skill, "content_sha256")}`,
46266
+ `validation_warnings: ${warnings}`
46267
+ ].join("\n");
46268
+ };
46269
+ }
46270
+ function formatAssignment(output) {
46271
+ const record2 = asRecord(output);
46272
+ const assignment = asRecord(record2.assignment);
46273
+ return [
46274
+ `Skill assignment ${field(record2, "approval_status")}: \`${field(assignment, "slug")}\` v${field(assignment, "version")} \u2192 seat ${field(assignment, "seat_id")}`,
46275
+ `assignment_id: ${field(assignment, "assignment_id")}`,
46276
+ `skill_version_id: ${field(assignment, "skill_version_id")}`,
46277
+ `dependency_status: ${field(asRecord(record2.dependency_status), "status")}`,
46278
+ `next: ${field(record2, "local_sync_next_step")}`
46279
+ ].join("\n");
46280
+ }
46281
+ function formatRevocation(output) {
46282
+ const record2 = asRecord(output);
46283
+ return [
46284
+ `Skill assignment revoked: \`${field(record2, "slug")}\` from seat ${field(record2, "seat_id")}`,
46285
+ `assignment_id: ${field(record2, "assignment_id")}`,
46286
+ `skill_version_id: ${field(record2, "skill_version_id")}`,
46287
+ `next: ${field(record2, "local_sync_next_step")}`
46288
+ ].join("\n");
46289
+ }
46195
46290
  var skillsWrapper = (context, args) => dispatch(context, "skills", args, {
46291
+ create: (ctx, rest) => {
46292
+ const parsed = parseFlags(rest);
46293
+ const body = withOptional({ package: packageFromSkillFile(requireValue2(parsed, "file")) }, {
46294
+ status: optionalValue(parsed, "status")
46295
+ });
46296
+ return execute(ctx, parsed, "skill.create", body, formatSkillWrite("Skill draft created"));
46297
+ },
46298
+ "update-draft": (ctx, rest) => {
46299
+ const parsed = parseFlags(rest);
46300
+ const body = withOptional({
46301
+ slug: requireValue2(parsed, "slug"),
46302
+ package: packageFromSkillFile(requireValue2(parsed, "file"))
46303
+ }, {
46304
+ status: optionalValue(parsed, "status")
46305
+ });
46306
+ return execute(ctx, parsed, "skill.update_draft", body, formatSkillWrite("Skill draft updated"));
46307
+ },
46308
+ publish: (ctx, rest) => {
46309
+ const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["allow-warnings"]));
46310
+ const body = withOptional({ allow_warnings: parsed.flags.has("allow-warnings") }, {
46311
+ slug: optionalValue(parsed, "slug"),
46312
+ skill_version_id: optionalValue(parsed, "skill-version-id")
46313
+ });
46314
+ return execute(ctx, parsed, "skill.publish", body, formatSkillWrite("Skill published"));
46315
+ },
46316
+ import: (ctx, rest) => {
46317
+ const [kind, ...remaining] = rest;
46318
+ if (kind === "github") {
46319
+ const parsed = parseFlags(remaining);
46320
+ const body = withOptional({ url: requireValue2(parsed, "url") }, {
46321
+ ref: optionalValue(parsed, "ref"),
46322
+ path: optionalValue(parsed, "path"),
46323
+ status: optionalValue(parsed, "status")
46324
+ });
46325
+ return execute(ctx, parsed, "skill.import_github", body, formatSkillWrite("GitHub skill imported"));
46326
+ }
46327
+ if (kind === "upload") {
46328
+ const parsed = parseFlags(remaining);
46329
+ const body = withOptional({ package: packageFromSkillFile(requireValue2(parsed, "file")) }, {
46330
+ status: optionalValue(parsed, "status")
46331
+ });
46332
+ return execute(ctx, parsed, "skill.import_upload", body, formatSkillWrite("Uploaded skill imported"));
46333
+ }
46334
+ throw new UsageError(`Usage: ${ctx.binName} skills import github|upload ...`);
46335
+ },
46196
46336
  list: (ctx, rest) => {
46197
46337
  const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["include-archived"]));
46198
46338
  const body = withOptional({}, {
@@ -46224,15 +46364,46 @@ var skillsWrapper = (context, args) => dispatch(context, "skills", args, {
46224
46364
  skill_version_id: optionalValue(parsed, "skill-version-id")
46225
46365
  });
46226
46366
  return execute(ctx, parsed, "skill.check_dependencies", body, formatDependencyCheck);
46367
+ },
46368
+ assign: (ctx, rest) => {
46369
+ const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["approve", "allow-blocked-proposal"]));
46370
+ const body = withOptional({
46371
+ seat_id: requireValue2(parsed, "seat-id"),
46372
+ status: parsed.flags.has("approve") ? "approved" : "proposed",
46373
+ rationale: optionalValue(parsed, "rationale") ?? "Skill assignment requested from the CLI.",
46374
+ allow_blocked_proposal: parsed.flags.has("allow-blocked-proposal")
46375
+ }, {
46376
+ slug: optionalValue(parsed, "slug") ?? optionalValue(parsed, "skill"),
46377
+ skill_version_id: optionalValue(parsed, "skill-version-id")
46378
+ });
46379
+ return execute(ctx, parsed, "skill.assign_to_seat", body, formatAssignment);
46380
+ },
46381
+ revoke: (ctx, rest) => {
46382
+ const parsed = parseFlags(rest);
46383
+ const body = withOptional({}, {
46384
+ assignment_id: optionalValue(parsed, "assignment-id"),
46385
+ seat_id: optionalValue(parsed, "seat-id"),
46386
+ slug: optionalValue(parsed, "slug") ?? optionalValue(parsed, "skill"),
46387
+ skill_version_id: optionalValue(parsed, "skill-version-id"),
46388
+ rationale: optionalValue(parsed, "rationale")
46389
+ });
46390
+ return execute(ctx, parsed, "skill.revoke_from_seat", body, formatRevocation);
46227
46391
  }
46228
46392
  }, skillsUsage(context.binName));
46229
46393
  function skillsUsage(bin) {
46230
- return `Usage: ${bin} skills list|get|file|assigned|check-dependencies [--json]
46394
+ return `Usage: ${bin} skills create|update-draft|publish|import|list|get|file|assigned|check-dependencies|assign|revoke [--json]
46395
+ ${bin} skills create --file ./SKILL.md [--status draft|pending_review]
46396
+ ${bin} skills update-draft --slug <slug> --file ./SKILL.md [--status draft|pending_review]
46397
+ ${bin} skills import github --url <github-url> [--ref <ref>] [--path <dir>] [--status draft|pending_review]
46398
+ ${bin} skills import upload --file ./SKILL.md [--status draft|pending_review]
46399
+ ${bin} skills publish (--slug <slug>|--skill-version-id <id>) [--allow-warnings]
46231
46400
  ${bin} skills list [--status draft|pending_review|published|archived] [--visibility private|seat|tenant] [--query <text>]
46232
46401
  ${bin} skills get --slug <slug>
46233
46402
  ${bin} skills file --slug <slug> --path SKILL.md
46234
46403
  ${bin} skills assigned [--seat-id <id>] [--seat <id>]
46235
- ${bin} skills check-dependencies --seat-id <id> (--slug <slug>|--skill-version-id <id>)`;
46404
+ ${bin} skills check-dependencies --seat-id <id> (--slug <slug>|--skill-version-id <id>)
46405
+ ${bin} skills assign --seat-id <id> (--slug <slug>|--skill-version-id <id>) [--approve] [--allow-blocked-proposal]
46406
+ ${bin} skills revoke (--assignment-id <id>|--seat-id <id> --slug <slug>)`;
46236
46407
  }
46237
46408
  var modelWrapper = (context, args) => dispatch(context, "model", args, {
46238
46409
  list: (ctx, rest) => {