@rosthq/cli 0.5.30 → 0.5.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmPnG;AA6cD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuPnG;AA+cD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
package/dist/index.js CHANGED
@@ -41637,7 +41637,7 @@ The Compass is drafted, then activated by a human through supersession.
41637
41637
  order: 20,
41638
41638
  title: "Responsibility Graph playbook",
41639
41639
  summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
41640
- version: "2026-06-20.2",
41640
+ version: "2026-06-30.1",
41641
41641
  public: true,
41642
41642
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41643
41643
  stages: ["graph_design", "staffing"],
@@ -41684,6 +41684,8 @@ Each entry opens the same conservative setup flow \u2014 seat placement, Steward
41684
41684
 
41685
41685
  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.
41686
41686
 
41687
+ Seat cards name their active occupants. When a seat has more than one occupant, the card shows the human/agent breakdown instead of only a count, and mixed human-plus-agent staffing is labelled. Use the occupants control on that card to open the detail panel, where each occupant is listed as either the human accountable for the seat or the agent executor, with the Steward chain shown for agent accountability.
41688
+
41687
41689
  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:
41688
41690
 
41689
41691
  - **Structure** \u2014 seat type and reporting lines.
@@ -41758,7 +41760,7 @@ When operating through CLI or MCP, create fewer seats first and ask for confirma
41758
41760
  order: 30,
41759
41761
  title: "Charter design playbook",
41760
41762
  summary: "How to draft strong Charters that work for human, agent, and hybrid seats.",
41761
- version: "2026-06-29.1",
41763
+ version: "2026-06-30.1",
41762
41764
  public: true,
41763
41765
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41764
41766
  stages: ["charter_design", "staffing"],
@@ -41815,7 +41817,9 @@ List and read first, then draft, then leave activation to a human.
41815
41817
  - Draft one: \`{{cli}} command charter.draft --json '{"seat_id":"<seat-id>"}'\` (scope: seat or tenant-admin); draft every eligible seat with \`charter.draft_all\` / \`rost_draft_all_charters\`. Draft commands are not gated \u2014 they produce a draft \`charter_version_id\`. \`charter.draft_all\` only drafts **active** seats and returns the real result: \`{ drafted, skipped, draft_ids, skipped_seats: [{ seat_id, reason }] }\` where \`reason\` is \`seat_not_active\` (the seat is still draft/vacant \u2014 confirm it first) or \`charter_exists\` (it already has a draft/active Charter). Read \`skipped_seats\` to see why a freshly-built graph drafted fewer Charters than it has seats.
41816
41818
  - Edit a draft: \`charter.update_draft\` / \`rost_update_charter_draft\` with the \`charter_version_id\` and the new \`doc\`.
41817
41819
 
41818
- In the app, \`/charters\` is both a drafting queue and a governance library. It shows active Charters, draft amendments, seats missing Charters, unsigned manifests, and steward-review gaps. Opening a live Charter is a review mode: read the active version, inspect its governance state, and open an amendment draft when the job needs to change. Active Charter content is never silently edited in place.
41820
+ In the app, \`/charters\` is both a drafting queue and a governance library. It shows active Charters, draft amendments, seats missing Charters, unsigned manifests, and steward-review gaps. \`/charters/builder\` is the seat picker for Charter Builder: start there when you need to draft a missing Charter, continue an amendment, or review which seats are still missing operating contracts. Opening a live Charter is a review mode: read the active version, inspect its governance state, and open an amendment draft when the job needs to change. Active Charter content is never silently edited in place.
41821
+
41822
+ Daily and weekly measurable rows can carry Signal metadata: unit, numeric target, direction, cadence, and source. When a human approves a Charter, those structured measurables materialize into tenant Signal definitions for that seat. Free-text, monthly, and quarterly measurable prose remains accountability text until a human converts it into a supported structured Signal or creates the Signal separately.
41819
41823
 
41820
41824
  ## When to stop for confirmation
41821
41825
 
@@ -42071,7 +42075,7 @@ The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provide
42071
42075
  order: 80,
42072
42076
  title: "Sync rhythm playbook",
42073
42077
  summary: "How Signal, Friction, Cascade, and Sync Briefs turn weekly meetings into decision time.",
42074
- version: "2026-06-20.2",
42078
+ version: "2026-06-30.1",
42075
42079
  public: true,
42076
42080
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42077
42081
  stages: ["operating_rhythm"],
@@ -42119,7 +42123,7 @@ The Sync Brief should answer:
42119
42123
 
42120
42124
  On screen the brief reads in plain terms: Signal exceptions, goal progress, task review, ranked Friction, and agent activity. Where a section has no source data, it lists gaps to confirm \u2014 the missing inputs a human should know about before the meeting \u2014 rather than a blank section.
42121
42125
 
42122
- Before the first brief exists, the Sync pages are readiness views. They show the next scheduled compile and the source areas that will feed it: Signal, Cascade, Tasks, Friction, and Agents. Use those links to add the missing source data; there is no manual compile button until the system has an idempotent persisted operation to run.
42126
+ Before the first brief exists, the Sync pages are readiness views. They show the next scheduled compile and the source areas that will feed it: Signal, Cascade, Tasks, Friction, and Agents. Use those links to add missing source data, or use Compile now to run the same idempotent persisted compile operation immediately when the company uses company-wide Sync Briefs. If the company is configured for per-cluster briefs, compile the target cluster from CLI or MCP with a cluster id until the UI offers a cluster selector. Once a brief exists, the page shows whether it covers the current period, when it was compiled, and which sections were omitted or compiled with gaps.
42123
42127
 
42124
42128
  The same readiness model appears around the meeting loop. Steward shows the governance loop even when no decision is waiting: which agent seats are stewarded, how many escalations are open, and recent raised/decided counts. Tasks explains when nothing is due and points to recently completed or agent-blocked work when it exists. The agent fleet shows configuration completeness per staffed agent seat \u2014 steward chain, lane/trigger/substrate, credentials, tools, model, dry run, and go-live \u2014 with links to the exact setup surface rather than a generic action button.
42125
42129
 
@@ -42146,7 +42150,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
42146
42150
  order: 45,
42147
42151
  title: "How agents work",
42148
42152
  summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
42149
- version: "2026-06-27.1",
42153
+ version: "2026-06-30.1",
42150
42154
  public: true,
42151
42155
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42152
42156
  stages: ["staffing", "operating_rhythm"],
@@ -42244,7 +42248,7 @@ Beyond each seat's own manifest, the company can set one ceiling on how much an
42244
42248
 
42245
42249
  ## What humans should review
42246
42250
 
42247
- 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, loaded Skill versions, 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.
42251
+ The Agents page shows fleet health first: live state, work evidence, failed runs, open held actions, cost, and the next operator action. Work evidence distinguishes fresh real runs, stale runs, no completed run yet, queued or running work orders, and recent failures. A failure link opens the failed run itself; queued or stale rows route the operator to the seat's agent operations instead of pretending there is a hidden run to inspect. The page 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, loaded Skill versions, 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. For a live agent, the seat page's agent operations panel can queue one immediate governed run through the same \`agent.run_now\` command path used by CLI and MCP; it does not expand authority or change the saved schedule.
42248
42252
 
42249
42253
  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.
42250
42254
 
@@ -42399,7 +42403,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42399
42403
  order: 48,
42400
42404
  title: "CLI and MCP installation guide",
42401
42405
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42402
- version: "2026-06-30.1",
42406
+ version: "2026-06-30.3",
42403
42407
  public: true,
42404
42408
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42405
42409
  stages: ["company_setup", "staffing"],
@@ -42522,9 +42526,10 @@ Commands below use angle-bracket placeholders. The CLI prints the real, fully-re
42522
42526
  A {{brand}} **account** (the human identity) is created with Google sign-in \u2014 in the browser at \`/signup\`, or headlessly via \`{{cli}} login --device\` (a human approves the code in any browser). A **company** (tenant) can then be created either way:
42523
42527
 
42524
42528
  - **Browser:** at \`/signup\`, name your company, then return to the CLI.
42525
- - **Headless (no browser step):** once logged in, run \`{{cli}} signup --company "<name>"\`. If the account has no active company yet, this provisions the first company for your session and makes it active, so \`{{cli}} onboard status\` and every other tenant-scoped command work immediately. This is the recommended path for an autonomous agent setting up from scratch.
42529
+ - **Headless first company (no browser step):** once logged in, run \`{{cli}} signup --company "<name>"\`. If the account has no active company yet, this provisions the first company for your session and makes it active, so \`{{cli}} onboard status\` and every other tenant-scoped command work immediately. This is the recommended path for an autonomous agent setting up from scratch.
42530
+ - **Additional entitled company:** from an existing active company session, run \`{{cli}} tenant create --company "<name>" [--json]\`. This creates a clean additional company only when the account has an active \`tenant.create.additional\` entitlement. A denied attempt returns a clean refusal and creates no tenant row.
42526
42531
 
42527
- If you run a tenant-scoped command before any company exists, the CLI tells you both options. \`{{cli}} signup --company\` is not a second-company creation command: running it again returns the active company, names the company you requested, and says that no new company was created. The default output is human-readable; add \`--json\` only when an automation needs the raw command output. To inspect or switch among companies you can already access, use \`{{cli}} tenants\` and \`{{cli}} use <tenant-slug-or-id>\`. Additional company creation is not exposed as a public self-serve CLI path in this milestone.
42532
+ If you run a tenant-scoped command before any company exists, the CLI tells you both first-company options. \`{{cli}} signup --company\` is not a second-company creation command: running it again returns the active company, names the company you requested, and says that no new company was created. The default output is human-readable; add \`--json\` only when an automation needs the raw command output. To inspect or switch among companies you can already access, use \`{{cli}} tenants\` and \`{{cli}} use <tenant-slug-or-id>\`.
42528
42533
 
42529
42534
  ## Install the CLI
42530
42535
 
@@ -42602,10 +42607,11 @@ This is the install/auth quickstart \u2014 it gets you logged in, MCP registered
42602
42607
  3. Create your company if you have none yet: \`{{cli}} signup --company "<name>"\` (no browser step)
42603
42608
  4. List tenants: \`{{cli}} tenants\`
42604
42609
  5. Select a tenant when needed: \`{{cli}} use <tenant-slug-or-id>\`
42605
- 6. Read the agent map: \`{{cli}} reference get agent-reference-map\` (the full canonical setup order lives here)
42606
- 7. Register MCP for the client (pick a scope \u2014 \`--scope\` is required): \`{{cli}} mcp install --client claude-code --scope tenant-admin\` for setup, or \`--scope seat --seat-id <id>\` for a narrower seat token
42607
- 8. Inspect onboarding: \`{{cli}} onboard status\`
42608
- 9. Get the guided agent prompt: \`{{cli}} onboard run\`
42610
+ 6. For an entitled additional clean company, create it from an active company session: \`{{cli}} tenant create --company "<name>"\`
42611
+ 7. Read the agent map: \`{{cli}} reference get agent-reference-map\` (the full canonical setup order lives here)
42612
+ 8. Register MCP for the client (pick a scope \u2014 \`--scope\` is required): \`{{cli}} mcp install --client claude-code --scope tenant-admin\` for setup, or \`--scope seat --seat-id <id>\` for a narrower seat token
42613
+ 9. Inspect onboarding: \`{{cli}} onboard status\`
42614
+ 10. Get the guided agent prompt: \`{{cli}} onboard run\`
42609
42615
 
42610
42616
  Or use the one-shot helper: \`{{cli}} init\` logs in when needed, optionally selects a tenant, installs MCP, and prints the onboarding prompt. It does not run every numbered step above (it does not create your company or call \`onboard status\`) \u2014 it gets you logged in, registered, and handed the onboarding prompt. As the first-run helper it defaults to a **tenant-admin** token (no seats exist yet), so unlike a direct \`mcp install\` it does not need \`--scope\`; pass \`--scope seat --seat-id <id>\` if you already have a seat to scope it to:
42611
42617
 
@@ -42789,6 +42795,7 @@ These are the security posture rules for operating after install \u2014 a checkl
42789
42795
  | \`{{cli}} login --device\` | Device-code login for a headless agent: prints a short code + URL, a human approves in any browser, the CLI polls until authorized \u2014 no browser session needed on the agent's machine. | User session | \`{{cli}} login --device\` |
42790
42796
  | \`{{cli}} logout\` | Clear the local CLI session. | Local session | \`{{cli}} logout\` |
42791
42797
  | \`{{cli}} signup [--company "<name>"] [--json]\` | With no flag, open/print the web signup page. With \`--company\`, bootstrap the first company headlessly for the logged-in session. If one is already active, it returns that company and says no new company was created. Add \`--json\` for machine-readable output. | Public (\`--company\` needs a login session) | \`{{cli}} signup --company "Acme"\` |
42798
+ | \`{{cli}} tenant create --company "<name>" [--json]\` | Create an additional clean company from an existing active company session. Requires \`tenant.create.additional\`; denied attempts create no tenant. Add \`--json\` for machine-readable output. | Logged-in tenant owner with entitlement | \`{{cli}} tenant create --company "Acme East"\` |
42792
42799
  | \`{{cli}} whoami\` | Show the authenticated user, accessible tenant roles, and the active tenant (\`current_tenant_id\`). | User | \`{{cli}} whoami\` |
42793
42800
  | \`{{cli}} tenants\` | List tenants the user can access; the active one is marked \`current\`. | User | \`{{cli}} tenants\` |
42794
42801
  | \`{{cli}} use <tenant>\` | Select a tenant slug or id as the active tenant for the session. It persists, so a following \`{{cli}} whoami\` reports it as \`current_tenant_id\`. | User | \`{{cli}} use acme-ops\` |
@@ -42848,7 +42855,7 @@ The signed-in app exposes the same Skill command surface under **Skills** in the
42848
42855
  | \`{{cli}} escalation list|get|resolve|reject\` | \`escalation.list\`, \`escalation.get\`, \`escalation.resolve\`, \`escalation.reject\` | Work the steward escalation queue. | Steward | \`{{cli}} escalation list --json\` |
42849
42856
  | \`{{cli}} error list|resolve|supersede\` | \`error_log.list\`, \`error_log.resolve\`, \`error_log.supersede\` | List active, acknowledged, resolved, or superseded product error logs and let a human acknowledge, resolve, or supersede stale errors with evidence links. | Tenant | \`{{cli}} error list --resolved active --json\`; \`{{cli}} error resolve --error-log-id <id> --reason "Fixed in PR #123"\` |
42850
42857
  | \`{{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\` |
42851
- | \`{{cli}} runner list|status|diagnose|repair|work-orders|revoke|serve\` | \`runner.list\`, \`runner.status\`, \`runner.diagnose\`, \`runner.repair\`, \`work_order.list\`, \`runner.revoke\`, runner endpoint APIs | Inspect runners and work orders, diagnose offline runners, get repair guidance, revoke a runner, or run the headless local runner loop. | Tenant | \`{{cli}} runner diagnose --runner-id <id> --json\`; \`{{cli}} runner serve --once\` |
42858
+ | \`{{cli}} runner list|status|diagnose|repair|work-orders|revoke|serve\` | \`runner.list\`, \`runner.status\`, \`runner.diagnose\`, \`runner.repair\`, \`work_order.list\`, \`runner.revoke\`, runner endpoint APIs | Inspect heartbeat and execute-readiness evidence, inspect work orders, diagnose offline runners, get repair guidance, revoke a runner, or run the headless local runner loop. | Tenant | \`{{cli}} runner diagnose --runner-id <id> --json\`; \`{{cli}} runner serve --once\` |
42852
42859
  | \`{{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\` |
42853
42860
  | \`{{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\` |
42854
42861
  | \`{{cli}} system health\` | \`system.health\` | Read the scoped system-health snapshot across agent runs, unresolved errors, Signals, Cascade setup, work loop, integrations, runners, notifications, and Sync Brief readiness. | Tenant, member, or seat token | \`{{cli}} system health --json\`; \`{{cli}} system health --seat <id> --json\` |
@@ -43007,8 +43014,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
43007
43014
  | \`rost_configure_agent_tools\` | \`agent.configure_tools\` | Connect or decline proposed tools and stage credential-ingress requests (vault refs only). | Seat or tenant-admin | Never send raw secrets; expect a credential confirmation. |
43008
43015
  | \`rost_run_agent_dry_run\` | \`agent.run_dry_run\` | Run the sandbox dry run for a draft agent; durable and idempotent per Charter version. | Seat or tenant-admin | Call after the manifest is signed; ungated by human approval, but precondition-gated on a signed manifest. |
43009
43016
  | \`rost_list_mcp_tokens\` | \`mcp_token.list\` | List MCP token metadata (never token material). | Tenant | Call with \`{}\` or \`{"include_revoked":true}\`. |
43010
- | \`rost_list_runners\` | \`runner.list\` | List local runners and their online/offline/revoked state. | Tenant | Call with \`{}\`. |
43011
- | \`rost_runner_status\` | \`runner.status\` | Read a single runner's capability and state. | Tenant | Call with \`runner_id\`. |
43017
+ | \`rost_list_runners\` | \`runner.list\` | List local runners with heartbeat health, execution readiness, queue counts, and recent result evidence. | Tenant | Call with \`{}\`. |
43018
+ | \`rost_runner_status\` | \`runner.status\` | Read a single runner's capability, heartbeat health, and execute-readiness state. | Tenant | Call with \`runner_id\`. |
43012
43019
  | \`rost_diagnose_runner\` | \`runner.diagnose\` | Return runner health, capabilities, and repair guidance without secrets. | Tenant | Call with \`runner_id\`; actionable repair guidance exposes restart, re-pair, or missing CLI steps. |
43013
43020
  | \`rost_runner_repair_guidance\` | \`runner.repair\` | Return focused repair steps for a runner: restart, re-pair, revoke stale, or install missing CLI runtime. | Tenant | Call with \`runner_id\` and optional \`issue\` (restart, re_pair, revoke_stale, missing_cli_runtime). |
43014
43021
  | \`rost_start_runner_pairing\` | \`runner.pairing.start\` | Open a runner pairing session and return the human pairing code. | Tenant-admin | Call with \`name\` and \`platform\`; owner/admin only. |
@@ -43554,7 +43561,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
43554
43561
  order: 60,
43555
43562
  title: "Cascade guide",
43556
43563
  summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
43557
- version: "2026-06-28.1",
43564
+ version: "2026-06-30.1",
43558
43565
  public: true,
43559
43566
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43560
43567
  stages: ["operating_rhythm"],
@@ -43614,7 +43621,7 @@ On \`/cascade\`, the screen renders the full goal depth, not just one or two lev
43614
43621
 
43615
43622
  ## Goal progress and at-risk goals
43616
43623
 
43617
- A goal can carry a quantified progress (0-100) distinct from its on/off/done status. Report it with \`goal.set_progress\`; when an agent reports progress it lands as a proposal a human approves before the goal moves. \`goal.list_at_risk\` projects which goals are off pace by comparing progress against the elapsed fraction of the cycle window (deterministic date math, no forecast model). Off-pace goals surface on \`/cascade\`, on the owner home, in the weekly Sync Brief, and as a weekly owner alert. Status-only goals (no progress recorded) are simply excluded from the projection.
43624
+ A goal can carry a quantified progress (0-100) distinct from its on/off/done status. Report it with \`goal.set_progress\`; when an agent reports progress it lands as a proposal a human approves before the goal moves. \`goal.list_at_risk\` projects which goals are off pace by comparing progress against the elapsed fraction of the cycle window (deterministic date math, no forecast model). Off-pace goals surface on \`/cascade\`, on the owner home, in the weekly Sync Brief, and as a weekly owner alert. Status-only goals (no progress recorded) are excluded from the projection and render as pending measurement, not as proven on track.
43618
43625
 
43619
43626
  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.
43620
43627
 
@@ -44076,7 +44083,7 @@ Every notification should include the seat, cause, evidence, and requested decis
44076
44083
  order: 75,
44077
44084
  title: "Local runner guide",
44078
44085
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
44079
- version: "2026-06-21.1",
44086
+ version: "2026-06-30.1",
44080
44087
  public: true,
44081
44088
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44082
44089
  stages: ["staffing", "operating_rhythm"],
@@ -44105,10 +44112,10 @@ The local runner is for human-controlled local agent work. It should retrieve {{
44105
44112
  ## Inspect and control runners from CLI or MCP
44106
44113
 
44107
44114
  - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code. This is owner/admin-only because it mints a short-lived runner pairing session that leads to machine credentials.
44108
- - 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.
44115
+ - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows heartbeat state plus execution readiness. A runner is execute-ready only when it has a live heartbeat, a detected local Claude or Codex runtime, and recent claim/result evidence or active queue processing. \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner with the same execution detail, due queue count, claimed/running counts, and recent result timestamps.
44109
44116
  - Diagnose (DER-949): \`{{cli}} runner diagnose --runner-id <id>\` / \`runner.diagnose\` / \`rost_diagnose_runner\` returns health, capabilities, and repair guidance without exposing secrets. Use when a runner is offline or stale to get actionable next steps.
44110
44117
  - Repair steps (DER-949): \`{{cli}} runner repair --runner-id <id> [--issue restart|re_pair|revoke_stale|missing_cli_runtime]\` / \`runner.repair\` / \`rost_repair_runner\` returns focused repair instructions. The optional \`issue\` flag narrows to a specific kind of repair (restart the app, re-pair, revoke a stale runner, or install a missing CLI runtime).
44111
- - 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\`.
44118
+ - 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\`. The operator Settings page mirrors queued, claimed, running, and recent completed runner evidence so online does not imply can execute.
44112
44119
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
44113
44120
 
44114
44121
  ## Owner-initiated headless pairing
@@ -44120,6 +44127,7 @@ Use this flow when a headless or desktop runner cannot use the interactive web c
44120
44127
  3. The runner calls \`POST /api/runner/pairing/claim\` with \`{"user_code":"ABCD-2345"}\`.
44121
44128
  4. The response returns \`runner_id\`, \`runner_secret\`, \`name\`, and \`platform\`. Store the runner secret only on the runner machine.
44122
44129
  5. The runner sends heartbeats with \`Authorization: Bearer <runner_secret>\` and then claims work orders.
44130
+ 6. For a local smoke, run the headless runner in explicit one-shot execute mode: \`RUNNER_EXECUTE=1 RUNNER_ONCE=1 node apps/runner/scripts/headless-runner.mjs\`. It heartbeats once, claims at most one due read-only work order, reports the result, and exits nonzero if no executable work was claimed or result reporting failed. Without \`RUNNER_ONCE=1\`, the headless runner stays alive and continues heartbeating.
44123
44131
 
44124
44132
  ## When to stop for confirmation
44125
44133
 
@@ -47614,7 +47622,7 @@ function formatSystemHealth(output) {
47614
47622
  `signals: off_track=${field(signals, "off_track_count")} pending=${field(signals, "pending_count")}`,
47615
47623
  `cascade: recommendations=${field(cascade, "recommendation_count")} warnings=${field(cascade, "warning_count")}`,
47616
47624
  `work_loop: open_issues=${field(workLoop, "open_issue_count")} friction_without_task=${field(workLoop, "friction_without_task_count")} open_or_stalled_tasks=${field(workLoop, "open_or_stalled_task_count")}`,
47617
- `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
47625
+ `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} not_ready_runners=${field(connectivity, "not_execute_ready_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
47618
47626
  `sync: latest_brief=${field(sync, "latest_brief_at")} missing_latest_brief=${field(sync, "missing_latest_brief")} flagged_gaps=${field(sync, "flagged_gap_count")}`
47619
47627
  );
47620
47628
  return lines.join("\n");
@@ -47774,6 +47782,13 @@ var signupProvisionOutputSchema = external_exports.object({
47774
47782
  name: external_exports.string().min(1),
47775
47783
  created: external_exports.boolean()
47776
47784
  }).loose();
47785
+ var tenantCreateOutputSchema = signupProvisionOutputSchema.extend({
47786
+ source_tenant_id: external_exports.string().min(1),
47787
+ entitlement_id: external_exports.string().min(1),
47788
+ accounting_event_id: external_exports.string().min(1),
47789
+ active: external_exports.boolean(),
47790
+ next_action: external_exports.string().min(1)
47791
+ }).loose();
47777
47792
  async function runSignupProvision(io, client, companyName, run2, options = {}) {
47778
47793
  const exitCode = await run2(io, client, "signup.provision_tenant", { company_name: companyName });
47779
47794
  if (exitCode.exitCode === 0) {
@@ -47800,6 +47815,40 @@ async function runSignupProvision(io, client, companyName, run2, options = {}) {
47800
47815
  }
47801
47816
  return exitCode.exitCode;
47802
47817
  }
47818
+ async function runTenantCreate(io, client, args, run2) {
47819
+ const [action, ...rest] = args;
47820
+ if (action !== "create") {
47821
+ io.stderr.write(`Usage: ${cliBrand.binName} tenant create --company "<name>" [--json]
47822
+ `);
47823
+ return 1;
47824
+ }
47825
+ const json2 = rest.includes("--json");
47826
+ const companyIndex = rest.indexOf("--company");
47827
+ const companyName = companyIndex === -1 ? void 0 : rest[companyIndex + 1];
47828
+ if (!companyName || companyName.startsWith("--") || companyName.trim() === "") {
47829
+ io.stderr.write(`--company requires a value, e.g. ${cliBrand.binName} tenant create --company "Acme Ops"
47830
+ `);
47831
+ return 1;
47832
+ }
47833
+ const exitCode = await run2(io, client, "tenant.create", { company_name: companyName });
47834
+ if (exitCode.exitCode === 0) {
47835
+ const parsed = tenantCreateOutputSchema.safeParse(exitCode.output);
47836
+ if (!parsed.success) {
47837
+ io.stderr.write("tenant.create returned an unexpected response shape.\n");
47838
+ return 1;
47839
+ }
47840
+ if (json2) {
47841
+ io.stdout.write(`${JSON.stringify(parsed.data, null, 2)}
47842
+ `);
47843
+ return exitCode.exitCode;
47844
+ }
47845
+ io.stdout.write(
47846
+ `Company '${parsed.data.name}' is ready and active (${parsed.data.slug}). ${parsed.data.next_action}
47847
+ `
47848
+ );
47849
+ }
47850
+ return exitCode.exitCode;
47851
+ }
47803
47852
  async function runSignup(io, appUrl2, openBrowser2 = tryOpenBrowser) {
47804
47853
  const url2 = signupUrl(appUrl2);
47805
47854
  await openBrowser2(url2);
@@ -48857,6 +48906,9 @@ Run ${cliBrand.binName} login --device again if the next command asks you to aut
48857
48906
  if (command === "signup") {
48858
48907
  return runSignupProvision(io, client, signupCompany, (signupIo, signupClient, commandId, body) => executeCommandWithResult(signupIo, signupClient, commandId, body), { json: signupJson });
48859
48908
  }
48909
+ if (command === "tenant") {
48910
+ return runTenantCreate(io, client, args, (tenantIo, tenantClient, commandId, body) => executeCommandWithResult(tenantIo, tenantClient, commandId, body));
48911
+ }
48860
48912
  if (command === "whoami") {
48861
48913
  return printCommandOutput(io, client, "user.whoami");
48862
48914
  }
@@ -49253,7 +49305,7 @@ function parseJsonBody(args) {
49253
49305
  return JSON.parse(body);
49254
49306
  }
49255
49307
  function isCommand(value) {
49256
- return value === "login" || value === "logout" || value === "signup" || value === "whoami" || value === "tenants" || value === "use" || value === "command" || value === "onboard" || value === "mcp" || value === "skills" || value === "init" || value === "docs" || value === "reference" || value === "doctor" || value === "help";
49308
+ return value === "login" || value === "logout" || value === "signup" || value === "tenant" || value === "whoami" || value === "tenants" || value === "use" || value === "command" || value === "onboard" || value === "mcp" || value === "skills" || value === "init" || value === "docs" || value === "reference" || value === "doctor" || value === "help";
49257
49309
  }
49258
49310
  function printUsage(io) {
49259
49311
  io.stdout.write([
@@ -49261,6 +49313,7 @@ function printUsage(io) {
49261
49313
  `${cliBrand.binName} login --device`,
49262
49314
  `${cliBrand.binName} logout`,
49263
49315
  `${cliBrand.binName} signup [--company "<name>"]`,
49316
+ `${cliBrand.binName} tenant create --company "<name>" [--json]`,
49264
49317
  `${cliBrand.binName} whoami`,
49265
49318
  `${cliBrand.binName} tenants`,
49266
49319
  `${cliBrand.binName} use <tenant>`,