@rosthq/cli 0.6.0 → 0.6.2

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":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EA4K3D,CAAC"}
1
+ {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAmL3D,CAAC"}
package/dist/index.js CHANGED
@@ -42403,7 +42403,7 @@ External connectors are being rolled out provider by provider, conservatively (r
42403
42403
  order: 48,
42404
42404
  title: "CLI and MCP installation guide",
42405
42405
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42406
- version: "2026-06-30.6",
42406
+ version: "2026-07-01.1",
42407
42407
  public: true,
42408
42408
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42409
42409
  stages: ["company_setup", "staffing"],
@@ -43056,6 +43056,13 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
43056
43056
  | \`rost_correct_signal_reading\` | \`signal.correct_reading\` | Overwrite a reading with a human-confirmed value. | Seat or tenant-admin | Manual correction; expect confirmation. |
43057
43057
  | \`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"}\`. |
43058
43058
  | \`rost_import_signals_from_csv\` | \`signal.import\` | Bulk-import measurable definitions + trailing historical readings from a parsed scorecard export (e.g. a ninety CSV). Owners resolve to seats; readings are human-confirmed; re-import upserts by (measurable, period, cadence); a cross-cadence row is reported and skipped, not overwritten. | Tenant | Call with the parsed \`measurables\` array. |
43059
+ | \`rost_discover_a_connection_for_signals\` | \`integration.discover\` | Read-only introspection of a connected source: returns non-secret metadata and a recipe skeleton to author a signal pull against. | Tenant | No network; call with \`{"integration_id":"<id>"}\`. |
43060
+ | \`rost_preview_a_signal_source\` | \`signal.preview\` | Run a candidate recipe live but read-only against an allowlisted HTTPS source; returns the extracted value and a short-lived \`preview_token\`. Never mutates; the credential is resolved from the connection at execution and never stored in the recipe. | Tenant | Call with \`{"measurable_id":"<id>","integration_id":"<id>","recipe":{...}}\`. |
43061
+ | \`rost_bind_a_signal_source_draft\` | \`signal.bind\` | Persist the validated recipe as an inert \`draft\` binding; requires the \`preview_token\` from a preview of the same recipe, so nothing is bound that was not first seen working. | Tenant | Call with \`{"measurable_id":"<id>","integration_id":"<id>","recipe":{...},"cadence":"weekly","preview_token":"<token>"}\`. |
43062
+ | \`rost_confirm_and_activate_a_signal_binding\` | \`signal.bind_confirm\` | Human-only: activates a draft binding (\`draft -> active\`) so scheduled pulls begin writing confirmed readings. An agent that calls it produces a pending confirmation instead. | Tenant | Human confirms; call with \`{"binding_id":"<id>"}\`. |
43063
+ | \`rost_import_friction_issues_from_a_ninety_issues_list\` | \`friction.import\` | Bulk-import issues as Friction items for the named owner seat (from a ninety Issues List export). Owners resolve to seats; idempotent re-import skips an open issue already imported for the same seat + summary; whole-file re-import is skipped by content hash. | Tenant | Call with the parsed \`issues\` array. |
43064
+ | \`rost_import_tasks_from_a_ninety_to_dos_export\` | \`task.import\` | Bulk-import To-Dos as tasks the named owner seat owns (from a ninety To-Dos export), provenance origin_kind:manual. Owners resolve to seats; idempotent re-import skips a non-terminal task already imported for the same seat + title. | Tenant | Call with the parsed \`todos\` array. |
43065
+ | \`rost_import_rocks_from_a_ninety_rocks_export\` | \`cascade.import\` | Bulk-import Rocks as Cascade cycle goals under a company objective in the active cycle (from a ninety Rocks export). Owners resolve to seats; idempotent re-import skips a cycle goal already imported for the same objective + seat + title. | Tenant | Call with the parsed \`rocks\` array. |
43059
43066
  | \`rost_list_cascade_goals\` | \`goal.list\` | List Cascade goals, optionally by cycle or seat. | Seat or tenant-admin | Call with \`{}\` or \`{"cycle_id":"<id>"}\`. |
43060
43067
  | \`rost_create_cascade_goal\` | \`goal.create\` | Create a cycle goal under an objective. | Tenant | Call with cycle, seat, parent, title, definition of done. |
43061
43068
  | \`rost_update_cascade_goal\` | \`goal.update\` | Update a goal's title or definition of done. | Tenant | Call with \`goal_id\` and the changed fields. |
@@ -43567,7 +43574,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
43567
43574
  order: 60,
43568
43575
  title: "Cascade guide",
43569
43576
  summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
43570
- version: "2026-06-30.1",
43577
+ version: "2026-06-30.2",
43571
43578
  public: true,
43572
43579
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43573
43580
  stages: ["operating_rhythm"],
@@ -43603,12 +43610,21 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
43603
43610
 
43604
43611
  Cascade connects company direction to seat-level commitments. It is a goal tree, not a ticket tracker. Work belongs in Cascade when it explains how a seat contributes to a larger outcome.
43605
43612
 
43613
+ ## The four goal kinds
43614
+
43615
+ Cascade has four goal kinds that form one chain from vision to sub-step:
43616
+
43617
+ - **Horizon** goals (10-year, 3-year, 1-year) live in the Compass document, not in the goal tree. They change by supersession, roughly yearly.
43618
+ - **Company objective** \u2014 the quarter's company-level rocks. Each is a cascade root that ties back to the active Compass's 1-year horizon, is materialized from the Compass, and renders as a read-only header tier on \`/cascade\` (edited through the Compass or by leadership, not inline). Re-versioning the Compass keeps the in-flight quarter's objectives intact \u2014 it never orphans them.
43619
+ - **Seat goal** \u2014 a seat's quarterly rocks. A seat goal connects under a company objective, and seat goals may still nest (a function seat goal above an agent execution seat goal) for the accountable-human layer.
43620
+ - **Milestone** \u2014 optional sub-steps of a seat goal. Completing milestones automatically rolls into the parent seat goal's progress, so a rock's percentage reflects real sub-step completion.
43621
+
43606
43622
  ## Good Cascade structure
43607
43623
 
43608
- - Company goals connect back to the Compass.
43609
- - Team or function goals connect to company goals. This is the accountable human layer for most agent work.
43610
- - Agent execution goals connect below the human or function goal they advance, unless the agent seat is intentionally accountable for that outcome.
43611
- - Seat commitments connect to the goal they advance.
43624
+ - Company objectives connect back to the Compass 1-year horizon.
43625
+ - Team or function seat goals connect to company objectives. This is the accountable human layer for most agent work.
43626
+ - Agent execution seat goals connect below the human or function goal they advance, unless the agent seat is intentionally accountable for that outcome.
43627
+ - Milestones connect below the seat goal they break down.
43612
43628
  - Each commitment has one owning seat.
43613
43629
  - Status is evidence-based where possible.
43614
43630
 
@@ -43627,7 +43643,7 @@ On \`/cascade\`, the screen renders the full goal depth, not just one or two lev
43627
43643
 
43628
43644
  ## Goal progress and at-risk goals
43629
43645
 
43630
- 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.
43646
+ 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. A seat goal that has milestones takes its progress from milestone completion instead \u2014 the percentage is the share of its non-dropped milestones marked done, recomputed automatically as milestones complete, drop, or re-open. \`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.
43631
43647
 
43632
43648
  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.
43633
43649
 
@@ -43655,7 +43671,7 @@ Agents can suggest commitments and report progress. They should not create a new
43655
43671
  order: 61,
43656
43672
  title: "Signal guide",
43657
43673
  summary: "How to define and read measurables so the company runs on evidence instead of status theater.",
43658
- version: "2026-06-30.1",
43674
+ version: "2026-07-01.1",
43659
43675
  public: true,
43660
43676
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43661
43677
  stages: ["operating_rhythm"],
@@ -43668,7 +43684,11 @@ Agents can suggest commitments and report progress. They should not create a new
43668
43684
  "signal.confirm_reading",
43669
43685
  "signal.correct_reading",
43670
43686
  "measurable.create",
43671
- "signal.import"
43687
+ "signal.import",
43688
+ "integration.discover",
43689
+ "signal.preview",
43690
+ "signal.bind",
43691
+ "signal.bind_confirm"
43672
43692
  ],
43673
43693
  legal: {
43674
43694
  publicRisk: "low",
@@ -43714,6 +43734,17 @@ A human can run the whole loop from the Signal page. Each measurable has a "Log
43714
43734
 
43715
43735
  To move off a spreadsheet or another operating tool, upload a scorecard export from the Signal page "Import from CSV" panel (the \`signal.import\` command, also available on CLI/MCP). Each row becomes a measurable owned by the seat whose name matches the row's owner, with its target, unit, direction, cadence, and trailing readings. Import is idempotent \u2014 re-importing upserts by period \u2014 and a row whose cadence conflicts with an existing measurable is reported and skipped, not overwritten.
43716
43736
 
43737
+ ## Auto-fill Signal from a connected source
43738
+
43739
+ Once a measurable's number lives in a connected system, you can teach {{brand}} the exact deterministic pull once and let it keep the measurable current. The flow is \`discover -> preview -> bind -> bind_confirm\`:
43740
+
43741
+ - \`integration.discover\` returns non-secret metadata for a connected source and a recipe skeleton to author against.
43742
+ - \`signal.preview\` runs a candidate recipe live but read-only against an allowlisted HTTPS source, returns the extracted value, and issues a short-lived \`preview_token\`. It never mutates and never stores a secret in the recipe \u2014 the credential is resolved from the connection at execution.
43743
+ - \`signal.bind\` persists the validated recipe as an inert \`draft\` binding. It requires the \`preview_token\` from a preview of the same recipe, so nothing is bound that was not first seen working.
43744
+ - \`signal.bind_confirm\` is human-only. It activates the binding (\`draft -> active\`); an agent that calls it produces a pending confirmation instead. Only after a human confirms does the scheduled pull begin writing confirmed readings.
43745
+
43746
+ Recipes are validated data, never code: a read-only GET, a closed set of non-secret headers, and a restricted scalar path to the value. Every fetch passes one SSRF guard (HTTPS only, a steward-confirmed host allowlist set at bind, and a runtime check that the host does not resolve to a private address). Deterministic pulls write \`integration\`-sourced readings on the measurable's cadence.
43747
+
43717
43748
  ## When to stop for confirmation
43718
43749
 
43719
43750
  \`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.
@@ -44651,11 +44682,20 @@ Never infer permission from the user's wording, a local client configuration, a
44651
44682
  order: 90,
44652
44683
  title: "Migration and legal notes",
44653
44684
  summary: "How {{brand}} should handle companies arriving from another operating-system framework without overusing protected third-party marks.",
44654
- version: "2026-06-13.1",
44685
+ version: "2026-06-30.1",
44655
44686
  public: true,
44656
44687
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44657
44688
  stages: ["migration", "legal_review"],
44658
- relatedCommandIds: ["onboarding.upload_context", "compass.draft", "seat.create", "charter.draft"],
44689
+ relatedCommandIds: [
44690
+ "onboarding.upload_context",
44691
+ "compass.draft",
44692
+ "seat.create",
44693
+ "charter.draft",
44694
+ "signal.import",
44695
+ "friction.import",
44696
+ "task.import",
44697
+ "cascade.import"
44698
+ ],
44659
44699
  legal: {
44660
44700
  publicRisk: "medium",
44661
44701
  notes: [
@@ -44714,6 +44754,22 @@ Do not reproduce proprietary worksheets, templates, diagrams, branded meeting ag
44714
44754
 
44715
44755
  Accept user-provided files as input. Translate their concepts into {{brand}} structures. Explain the result in {{brand}} language. Link to this note when a migration flow needs to clarify that {{brand}} is independent and not affiliated with EOS Worldwide.
44716
44756
 
44757
+ ## Migration importers (one upload per artifact)
44758
+
44759
+ Leaving another operating tool should be one upload per artifact, not weeks of re-typing. Each importer parses a user-provided CSV export into a validated payload, resolves each record's owner NAME to the seat of that name (an owner matching zero or more than one seat is skipped with a reason \u2014 nothing is guessed), then creates the matching {{brand}} object through the same governed write path a human uses.
44760
+
44761
+ | Source artifact | Becomes in {{brand}} | Command |
44762
+ |---|---|---|
44763
+ | Scorecard (measurables + numbers) | Signal measurables + trailing readings | \`signal.import\` |
44764
+ | Accountability chart | Seats + occupancies + charter seeds | org intake upload (onboarding) |
44765
+ | Issues list | Friction issues | \`friction.import\` |
44766
+ | To-dos | Tasks (provenance origin_kind:manual) | \`task.import\` |
44767
+ | Rocks | Cascade cycle goals under a company objective | \`cascade.import\` |
44768
+
44769
+ Each importer is available on CLI and MCP (owner-scoped tenant admin) and is the single write path behind every surface. \`friction.import\` maps priority words to low/med/high/critical (blank defaults to med). \`task.import\` keeps a valid \`YYYY-MM-DD\` due date when present. \`cascade.import\` requires an active cycle and a company objective (auto-selected when exactly one exists in the active cycle, otherwise pass the objective to attach under).
44770
+
44771
+ Imports are a human migration action: they require a human actor, write human-confirmed records, and record an append-only provenance row per import. They are idempotent two ways \u2014 re-uploading the identical file is a no-op, and within a file an existing matching record (same seat + title, or same seat + summary) is skipped rather than duplicated. A dry run reports counts without writing.
44772
+
44717
44773
  ## Agent guidance
44718
44774
 
44719
44775
  Agents should not teach EOS as EOS. They should use {{brand}}'s method. When a user asks about a migration from EOS, agents may say that {{brand}} can import and translate familiar operating-system artifacts into Compass, Responsibility Graph, Charters, Cascade, Signal, Friction, and Sync.`
@@ -45870,6 +45926,7 @@ var COMMAND_MANIFEST = [
45870
45926
  { "id": "agent.show_markdown", "namespace": "agent", "action": "show_markdown", "title": "Show agent setup as markdown", "description": "Compose a seat's agent setup, steward, model, tools, and Charter into a clean, human-skimmable markdown card for review.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Render a seat's agent setup, model, steward, tools, and Charter as a clean markdown card to show your human a quick review." },
45871
45927
  { "id": "agent.status", "namespace": "agent", "action": "status", "title": "Get agent status", "description": "Return the agent occupancy, lane, schedule, live/offline state, steward chain, dry-run result, and Runner availability for a seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Check an agent's lane, live state, steward chain, dry-run result, and Runner availability before relying on it." },
45872
45928
  { "id": "agent.update_schedule", "namespace": "agent", "action": "update_schedule", "title": "Update agent schedule", "description": "Set or clear the scheduled execution cron for a draft or live agent on a seat.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": true }], "hasComplexInput": false, "help": "Set or clear an agent's scheduled execution; a live scheduled agent must keep a steward chain resolving to a human." },
45929
+ { "id": "cascade.import", "namespace": "cascade", "action": "import", "title": "Import Rocks from a ninety Rocks export", "description": "Bulk-import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle. Owners are seat names resolved to seats. Requires an active cycle and a target company objective (auto-selected when exactly one exists, else pass parent_objective_id). Idempotent \u2014 re-importing the same export is a no-op, and an existing cycle goal with the same objective + seat + title is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }, { "name": "parent_objective_id", "flag": "parent-objective-id", "type": "string", "required": false }], "hasComplexInput": true, "help": "Import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle; owners resolve to seats." },
45873
45930
  { "id": "charter.apply_seat_type_recommendation", "namespace": "charter", "action": "apply_seat_type_recommendation", "title": "Apply Charter seat-type recommendation", "description": "Apply the seat-type recommendation from a draft Charter.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Apply seat-type recommendations only after the Charter clarifies work shape, risk, and Steward accountability." },
45874
45931
  { "id": "charter.approve", "namespace": "charter", "action": "approve", "title": "Approve charter", "description": "Approve a draft Charter as a human owner.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "charter_version_id", "flag": "charter-version-id", "type": "string", "required": false }, { "name": "apply_seat_type", "flag": "apply-seat-type", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Charter approval is a human decision that activates the seat's operating contract." },
45875
45932
  { "id": "charter.draft", "namespace": "charter", "action": "draft", "title": "Draft charter", "description": "Create or fetch a draft Charter for a seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Draft Charters that define purpose, responsibilities, decision authority, measurables, tools, budget, and escalation; the charter authoring deep-dive shows what good looks like per field." },
@@ -45912,6 +45969,7 @@ var COMMAND_MANIFEST = [
45912
45969
  { "id": "escalation.resolve", "namespace": "escalation", "action": "resolve", "title": "Resolve escalation", "description": "Approve an open escalation (or convert it to Friction). Writes a human decision; agents cannot resolve.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "action", "flag": "action", "type": "enum", "required": false, "enumValues": ["approve", "convert_to_issue"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an escalation as a human Steward; the decision records decided_by as the approving human. Agents cannot resolve." },
45913
45970
  { "id": "friction.assist", "namespace": "friction", "action": "assist", "title": "Assist Friction issue", "description": "Advisory IDS assist for an issue: the most-similar prior resolved issues with their root causes and decisions, a recurring-pattern flag, and recommended options. Read-only \u2014 it never resolves the issue.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Advisory IDS assist: the most-similar prior resolved issues with their root causes and decisions, plus a recurring-pattern flag. Read-only \u2014 it never resolves the issue." },
45914
45971
  { "id": "friction.file_issue", "namespace": "friction", "action": "file_issue", "title": "File Friction issue", "description": "Emit an issue event and open a Friction issue raised by the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "summary", "flag": "summary", "type": "string", "required": true }, { "name": "blocking_goal_id", "flag": "blocking-goal-id", "type": "string", "required": false }, { "name": "broken_measurable_id", "flag": "broken-measurable-id", "type": "string", "required": false }, { "name": "severity", "flag": "severity", "type": "enum", "required": true, "enumValues": ["low", "med", "high", "critical"] }], "hasComplexInput": true, "help": "File a Friction issue with evidence when a goal or measurable is blocked or broken." },
45972
+ { "id": "friction.import", "namespace": "friction", "action": "import", "title": "Import Friction issues from a ninety Issues List", "description": "Bulk-import a ninety Issues List export into Friction. Owners are seat names resolved to seats; each issue is raised by the resolved seat and attributed to the importing human. Idempotent \u2014 re-importing the same export is a no-op, and an existing open issue with the same seat + summary is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Import a ninety Issues List export into Friction; owners resolve to seats, idempotent by file + seat/summary." },
45915
45973
  { "id": "friction.link_task", "namespace": "friction", "action": "link_task", "title": "Link task to Friction issue", "description": "Attach an existing tenant task as the action task for a non-terminal issue. Both ids must belong to the tenant.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "task_id", "flag": "task-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Attach an existing task as the action task for a non-terminal issue." },
45916
45974
  { "id": "friction.list", "namespace": "friction", "action": "list", "title": "List Friction issues", "description": "List Friction issues ranked by status, impact, and severity. Defaults to active (open + diagnosing).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["open", "diagnosing", "resolved", "dropped", "active", "all"] }], "hasComplexInput": false, "help": "List Friction issues ranked by impact and severity to find the issue id before updating or resolving it." },
45917
45975
  { "id": "friction.resolve", "namespace": "friction", "action": "resolve", "title": "Resolve Friction issue", "description": "Resolve an issue with a root cause and remediation task. This records a human decision (decided_by) and creates the follow-up task in one transaction.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "issue_id", "flag": "issue-id", "type": "string", "required": true }, { "name": "root_cause", "flag": "root-cause", "type": "string", "required": true }, { "name": "owner_seat_id", "flag": "owner-seat-id", "type": "string", "required": true }, { "name": "task_title", "flag": "task-title", "type": "string", "required": true }, { "name": "task_description", "flag": "task-description", "type": "string", "required": true }, { "name": "done_by", "flag": "done-by", "type": "string", "required": true }, { "name": "resolving_seat_id", "flag": "resolving-seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve an issue with a root cause and remediation task; resolution is a human decision." },
@@ -45925,6 +45983,7 @@ var COMMAND_MANIFEST = [
45925
45983
  { "id": "goal.set_status", "namespace": "goal", "action": "set_status", "title": "Set Cascade goal status", "description": "Set a goal's status (on/off/done). Seat-scoped callers may set status only for their own goals.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "goal_id", "flag": "goal-id", "type": "string", "required": true }, { "name": "status", "flag": "status", "type": "enum", "required": true, "enumValues": ["on", "off", "done"] }], "hasComplexInput": false, "help": "Set a goal's status; seat tokens may only set status for their own goals." },
45926
45984
  { "id": "goal.update", "namespace": "goal", "action": "update", "title": "Update Cascade goal", "description": "Update a goal's title or definition of done. Topology (parent/seat) and status have dedicated commands.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "goal_id", "flag": "goal-id", "type": "string", "required": true }, { "name": "title", "flag": "title", "type": "string", "required": false }, { "name": "definition_of_done", "flag": "definition-of-done", "type": "string", "required": false }], "hasComplexInput": false, "help": "Update a goal's title or definition of done; topology and status have dedicated commands." },
45927
45985
  { "id": "graph.get", "namespace": "graph", "action": "get", "title": "Get Responsibility Graph", "description": "Return the tenant's Responsibility Graph: seats, edges, root, occupants, and status rollups.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read the Responsibility Graph to discover seat ids, parentage, occupants, and status before mutating or routing work." },
45986
+ { "id": "integration.discover", "namespace": "integration", "action": "discover", "title": "Discover a connection for signals", "description": "Read-only introspection of a connected source for signal binding. Returns non-secret adapter metadata and a rest-for-signals recipe skeleton to author against signal.preview. Exposes no secrets.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "integration_id", "flag": "integration-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read-only introspection of a connected source: returns non-secret metadata + a recipe skeleton to author a signal pull against. No network." },
45928
45987
  { "id": "integration.list", "namespace": "integration", "action": "list", "title": "List integrations", "description": "List tenant integration metadata and health status. Returns account/scopes/capabilities only; never secrets or vault refs.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "provider", "flag": "provider", "type": "string", "required": false }], "hasComplexInput": false, "help": "List connected integrations and their metadata-only health state before enabling a connector-backed tool." },
45929
45988
  { "id": "integration.readiness", "namespace": "integration", "action": "readiness", "title": "Check integration readiness", "description": "Return a safe connector setup checklist for operators and agents. Starts with Google and exposes no secrets.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "provider", "flag": "provider", "type": "enum", "required": false, "enumValues": ["google"] }], "hasComplexInput": false, "help": "Read the connector setup checklist before relying on Google-backed agent work; the checklist names missing config, connection, scopes, external verification, and handler blockers." },
45930
45989
  { "id": "integration.status", "namespace": "integration", "action": "status", "title": "Get integration status", "description": "Read one integration's metadata and latest health status. Returns no secret material.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "provider", "flag": "provider", "type": "string", "required": false }, { "name": "integration_id", "flag": "integration-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Read one integration's metadata-only status by provider or integration id." },
@@ -45932,7 +45991,7 @@ var COMMAND_MANIFEST = [
45932
45991
  { "id": "mcp_token.create", "namespace": "mcp_token", "action": "create", "title": "Create MCP token", "description": "Mint a tenant-admin or seat-scoped MCP token.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "scope", "flag": "scope", "type": "enum", "required": true, "enumValues": ["tenant_admin", "seat"] }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }, { "name": "expires_in_days", "flag": "expires-in-days", "type": "integer", "required": false }], "hasComplexInput": false, "help": "Create MCP tokens with the narrowest scope needed, and tell agents where to retrieve reference docs." },
45933
45992
  { "id": "mcp_token.list", "namespace": "mcp_token", "action": "list", "title": "List MCP tokens", "description": "List MCP token metadata (id, scope, seat, created/last-used/revoked). Never returns token material.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "include_revoked", "flag": "include-revoked", "type": "boolean", "required": false }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "List MCP token metadata (never token material) to audit which seats hold active sessions." },
45934
45993
  { "id": "mcp_token.revoke", "namespace": "mcp_token", "action": "revoke", "title": "Revoke MCP token", "description": "Revoke an MCP token immediately.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "token_id", "flag": "token-id", "type": "string", "required": true }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Revoke MCP access when a local session ends or seat authority changes." },
45935
- { "id": "measurable.create", "namespace": "measurable", "action": "create", "title": "Add a measurable", "description": "Create a measurable (a Signal a seat owns) with its target, unit, direction, and cadence. The seat owns it; readings attach to the measurable. Source is 'human' \u2014 a human-defined measurable a human logs.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "name", "flag": "name", "type": "string", "required": true }, { "name": "unit", "flag": "unit", "type": "string", "required": true }, { "name": "direction", "flag": "direction", "type": "enum", "required": true, "enumValues": ["up_good", "down_good"] }, { "name": "target", "flag": "target", "type": "number", "required": true }, { "name": "cadence", "flag": "cadence", "type": "enum", "required": true, "enumValues": ["daily", "weekly"] }], "hasComplexInput": false, "help": "Add a measurable a seat owns (name, unit, direction, target, cadence) before recording readings against it." },
45994
+ { "id": "measurable.create", "namespace": "measurable", "action": "create", "title": "Add a measurable", "description": "Create a measurable (a Signal a seat owns) with its target, unit, direction, and cadence. The seat owns it; readings attach to the measurable. Source is 'human' \u2014 a human-defined measurable a human logs.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "name", "flag": "name", "type": "string", "required": true }, { "name": "unit", "flag": "unit", "type": "string", "required": true }, { "name": "direction", "flag": "direction", "type": "enum", "required": true, "enumValues": ["up_good", "down_good"] }, { "name": "target", "flag": "target", "type": "number", "required": true }, { "name": "cadence", "flag": "cadence", "type": "enum", "required": true, "enumValues": ["daily", "weekly", "monthly", "quarterly", "annual"] }], "hasComplexInput": false, "help": "Add a measurable a seat owns (name, unit, direction, target, cadence) before recording readings against it." },
45936
45995
  { "id": "member.invite", "namespace": "member", "action": "invite", "title": "Invite member", "description": "Create a pending tenant invite for a human teammate. The acceptance link is delivered out of band, not in the command result.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "email", "flag": "email", "type": "string", "required": true }, { "name": "role", "flag": "role", "type": "enum", "required": true, "enumValues": ["owner", "steward", "member"] }, { "name": "byo_key", "flag": "byo-key", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Invite humans to the company by seat-aware role; the invite token is never returned over CLI or MCP." },
45937
45996
  { "id": "member.remove", "namespace": "member", "action": "remove", "title": "Remove member", "description": "Remove a tenant member. Blocked when it would orphan an agent steward chain.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "member_id", "flag": "member-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Remove a member; the no-orphan-agent guard blocks removing the only steward in an agent chain." },
45938
45997
  { "id": "member.update", "namespace": "member", "action": "update", "title": "Update member role", "description": "Change a tenant member's role.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "member_id", "flag": "member-id", "type": "string", "required": true }, { "name": "role", "flag": "role", "type": "enum", "required": true, "enumValues": ["owner", "steward", "member"] }], "hasComplexInput": false, "help": "Change a member's role; role changes are human-gated." },
@@ -45968,11 +46027,14 @@ var COMMAND_MANIFEST = [
45968
46027
  { "id": "settings.sync_brief_scope.get", "namespace": "settings", "action": "sync_brief_scope.get", "title": "Get Sync Brief scope", "description": "Read the tenant's Sync Brief scope: company_wide (one weekly brief) or per_cluster (one brief per cluster).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read whether weekly Sync Briefs compile company-wide (one brief) or per cluster (one brief per cluster)." },
45969
46028
  { "id": "settings.sync_brief_scope.update", "namespace": "settings", "action": "sync_brief_scope.update", "title": "Update Sync Brief scope", "description": "Set the tenant's Sync Brief scope (company_wide or per_cluster). Per_cluster falls back to company-wide when the tenant has no clusters.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "sync_brief_scope", "flag": "sync-brief-scope", "type": "enum", "required": true, "enumValues": ["company_wide", "per_cluster"] }], "hasComplexInput": false, "help": "Set Sync Brief scope to company_wide or per_cluster; per_cluster falls back to company-wide when no clusters exist." },
45970
46029
  { "id": "settings.update", "namespace": "settings", "action": "update", "title": "Update tenant settings", "description": "Update tenant AI budget caps (soft/hard, USD). Budget changes are dangerous and gated.", "requiredScope": "tenant", "confirmation": "dangerous", "exposeOverMcp": true, "fields": [{ "name": "soft_cap_usd", "flag": "soft-cap-usd", "type": "string", "required": false }, { "name": "hard_cap_usd", "flag": "hard-cap-usd", "type": "string", "required": false }], "hasComplexInput": false, "help": "Update tenant AI budget caps; budget changes are dangerous and require human confirmation." },
46030
+ { "id": "signal.bind", "namespace": "signal", "action": "bind", "title": "Bind a signal source (draft)", "description": "Persist a validated recipe + connection + cadence as an INERT draft binding for a measurable. Requires a valid preview_token from signal.preview of the same recipe. Never activates \u2014 a human signal.bind_confirm does that.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }, { "name": "integration_id", "flag": "integration-id", "type": "string", "required": true }, { "name": "cadence", "flag": "cadence", "type": "enum", "required": true, "enumValues": ["daily", "weekly", "monthly", "quarterly", "annual"] }, { "name": "host_allowlist", "flag": "host-allowlist", "type": "array", "required": true, "itemType": "string" }, { "name": "preview_token", "flag": "preview-token", "type": "string", "required": true }, { "name": "role", "flag": "role", "type": "enum", "required": false, "enumValues": ["informs", "drives_status"] }], "hasComplexInput": true, "help": "Persist a validated recipe as an inert draft binding; requires the preview_token from a preview of the same recipe." },
46031
+ { "id": "signal.bind_confirm", "namespace": "signal", "action": "bind_confirm", "title": "Confirm and activate a signal binding", "description": "Human-only activation of a draft signal binding (draft \u2192 active). Agents can never self-activate \u2014 an agent caller produces a pending confirmation. A drives_status binding requires a second-anchor confirmation. Once active, the scheduled pull auto-fills the measurable.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "binding_id", "flag": "binding-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Human-only: activate a draft signal binding (draft -> active) so scheduled pulls begin; an agent that calls it produces a pending confirmation." },
45971
46032
  { "id": "signal.confirm_reading", "namespace": "signal", "action": "confirm_reading", "title": "Confirm Signal reading", "description": "Confirm an unconfirmed reading as human-verified. Humans confirm; agents cannot. Idempotent on an already-confirmed reading.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "reading_id", "flag": "reading-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Confirm an unconfirmed reading as human-verified; confirmation is a human act, not an agent one." },
45972
46033
  { "id": "signal.correct_reading", "namespace": "signal", "action": "correct_reading", "title": "Correct Signal reading", "description": "Overwrite a reading for a period with a human-confirmed value. A manual correction is a human decision and is gated behind confirmation.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }, { "name": "period_start", "flag": "period-start", "type": "string", "required": true }, { "name": "value", "flag": "value", "type": "number", "required": true }], "hasComplexInput": false, "help": "Correct a reading only as a human; manual corrections that change confirmed data require confirmation." },
45973
46034
  { "id": "signal.get", "namespace": "signal", "action": "get", "title": "Get Signal", "description": "Return a measurable definition with its full reading history (confirmed and unconfirmed).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read a measurable's full reading history before confirming or correcting a value." },
45974
46035
  { "id": "signal.import", "namespace": "signal", "action": "import", "title": "Import Signals from CSV", "description": "Bulk-import measurable definitions and their historical readings from a parsed scorecard export (e.g. a ninety CSV). Owners are seat names resolved to seats; readings are human-confirmed. Idempotent \u2014 re-import upserts by (measurable, period, cadence). Re-importing a measurable at a different cadence is rejected, not overwritten.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Bulk-import measurables + historical readings from a parsed scorecard export (owners resolve to seats); idempotent, human-confirmed, re-import upserts by period." },
45975
46036
  { "id": "signal.list", "namespace": "signal", "action": "list", "title": "List Signals", "description": "List measurable definitions with their latest reading and on/off-track state. Seat-scoped callers see only their own seat.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "List Signals to find measurable ids and current on/off-track state before recording or correcting readings." },
46037
+ { "id": "signal.preview", "namespace": "signal", "action": "preview", "title": "Preview a signal source", "description": "Execute a candidate rest-for-signals recipe LIVE and read-only against an allowlisted HTTPS source, returning the extracted scalar and a short-lived preview_token required by signal.bind. Guarded (SSRF + restricted JSONPath); writes a signal_pull_log row. Never mutates.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }, { "name": "integration_id", "flag": "integration-id", "type": "string", "required": true }, { "name": "cadence", "flag": "cadence", "type": "enum", "required": true, "enumValues": ["daily", "weekly", "monthly", "quarterly", "annual"] }, { "name": "host_allowlist", "flag": "host-allowlist", "type": "array", "required": true, "itemType": "string" }], "hasComplexInput": true, "help": "Run a candidate recipe live but read-only against an allowlisted HTTPS source; returns the extracted value + a short-lived preview_token. Never mutates; the credential is resolved from the connection at execution." },
45976
46038
  { "id": "signup.provision_tenant", "namespace": "signup", "action": "provision_tenant", "title": "Create company", "description": "Provision a new company (tenant) for the authenticated CLI user with no web step.", "requiredScope": "user", "confirmation": "none", "exposeOverMcp": false, "fields": [{ "name": "company_name", "flag": "company-name", "type": "string", "required": true }], "hasComplexInput": false, "help": "Create the company headlessly when the CLI session has no tenant yet; it becomes the user's active tenant so the rest of setup runs with no web step." },
45977
46039
  { "id": "skill.assign_to_seat", "namespace": "skill", "action": "assign_to_seat", "title": "Assign skill to seat", "description": "Propose or human-approve a published immutable skill version for a Seat after checking required and optional tool dependencies.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "slug", "flag": "slug", "type": "string", "required": false }, { "name": "skill_version_id", "flag": "skill-version-id", "type": "string", "required": false }, { "name": "status", "flag": "status", "type": "enum", "required": false, "enumValues": ["proposed", "approved"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": true }, { "name": "allow_blocked_proposal", "flag": "allow-blocked-proposal", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Propose or human-approve a published Skill for a Seat after dependency checks. Missing required tools block approval; optional tools are warnings only." },
45978
46040
  { "id": "skill.assigned.list", "namespace": "skill", "action": "assigned.list", "title": "List assigned skills", "description": "List approved skill assignments for a Seat, including immutable version, dependency status, rationale, and approval time. Seat-scoped callers can only read their own assignments.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "List approved Skills assigned to a Seat before loading instructions into a run. A seat-scoped token can only read its own assigned Skills." },
@@ -46004,6 +46066,7 @@ var COMMAND_MANIFEST = [
46004
46066
  { "id": "task.complete", "namespace": "task", "action": "complete", "title": "Complete task", "description": "Complete an accepted handoff task and emit a handoff event back to the requesting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "summary", "flag": "summary", "type": "string", "required": true }], "hasComplexInput": true, "help": "Complete an accepted task with a summary so the requesting seat receives the handoff." },
46005
46067
  { "id": "task.create", "namespace": "task", "action": "create", "title": "Create task", "description": "Create a task (a commitment between seats). Agent-created tasks land in draft for human confirmation; human-created tasks are offered (handoff) or in progress.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "owner_seat_id", "flag": "owner-seat-id", "type": "string", "required": true }, { "name": "from_seat_id", "flag": "from-seat-id", "type": "string", "required": false }, { "name": "title", "flag": "title", "type": "string", "required": true }, { "name": "description", "flag": "description", "type": "string", "required": true }, { "name": "goal_id", "flag": "goal-id", "type": "string", "required": false }, { "name": "acceptance_criteria", "flag": "acceptance-criteria", "type": "array", "required": false, "itemType": "string" }, { "name": "due_on", "flag": "due-on", "type": "string", "required": false }], "hasComplexInput": false, "help": "Create a task as a commitment between seats; agent proposals land in draft for human confirmation.", "example": { "owner_seat_id": "0190dddd-dddd-7ddd-8ddd-dddddddddddd", "from_seat_id": "0190eeee-eeee-7eee-8eee-eeeeeeeeeeee", "title": "Reconcile the March vendor statements", "description": "Match every March vendor statement line to a recorded invoice and flag discrepancies.", "goal_id": "0190ffff-ffff-7fff-8fff-ffffffffffff", "acceptance_criteria": ["All March statements reconciled", "Discrepancies filed as Friction issues"], "due_on": "2026-04-15" } },
46006
46068
  { "id": "task.decline", "namespace": "task", "action": "decline", "title": "Decline task", "description": "Decline an offered handoff task owned by the acting seat with a reason.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "id", "flag": "id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Decline an offered task with a clear reason when it is out of scope for the seat." },
46069
+ { "id": "task.import", "namespace": "task", "action": "import", "title": "Import Tasks from a ninety To-Dos export", "description": "Bulk-import a ninety To-Dos export into Tasks. Owners are seat names resolved to seats; each to-do becomes a seat-owned task with provenance origin_kind:manual. Idempotent \u2014 re-importing the same export is a no-op, and an existing non-terminal task with the same seat + title is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Import a ninety To-Dos export into Tasks (origin_kind:manual); owners resolve to seats, idempotent by file + seat/title." },
46007
46070
  { "id": "task.list", "namespace": "task", "action": "list", "title": "List seat tasks", "description": "List open handoff tasks owned by the acting seat.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List the seat's open handoff tasks before accepting, declining, or completing work." },
46008
46071
  { "id": "task.update", "namespace": "task", "action": "update", "title": "Update task", "description": "Reschedule (due date), reassign (owner seat), or edit a non-terminal task's title, description, or acceptance criteria. Terminal tasks cannot be edited \u2014 a correction is a new task.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "task_id", "flag": "task-id", "type": "string", "required": true }, { "name": "owner_seat_id", "flag": "owner-seat-id", "type": "string", "required": false }, { "name": "due_on", "flag": "due-on", "type": "string", "required": false }, { "name": "title", "flag": "title", "type": "string", "required": false }, { "name": "description", "flag": "description", "type": "string", "required": false }, { "name": "acceptance_criteria", "flag": "acceptance-criteria", "type": "array", "required": false, "itemType": "string" }], "hasComplexInput": false, "help": "Reschedule, reassign, or edit a non-terminal task; terminal tasks are immutable (a correction is a new task)." },
46009
46072
  { "id": "team.health_score", "namespace": "team", "action": "health_score", "title": "Team health score", "description": "Return the single rolled-up 0\u2013100 team-health score (latest month) with its band (green/yellow/red) and label. Honest insufficient-data state when no metrics exist yet.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read the single rolled-up 0-100 team-health score (latest month) with its band and label." },