{
  "_meta": {
    "api_only": 51,
    "cli_commands": 872,
    "cli_version": "2.4.0",
    "commands": 923,
    "families": 43,
    "generator": "ai_backend/scripts/build_capabilities.py",
    "released": "2026-10-29",
    "schema_version": 1,
    "sources": {
      "capability list": 756,
      "schema list": 872
    }
  },
  "families": {
    "activity": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "returns_job",
        "canonical_command": "activity.export",
        "command_path": "activity export",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B19 ACTIVITY_EXPORT_UNTYPED_ASYNC]: format/filters/download response are raw; reserved, not registered.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ActivityExportResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/activity_log/export",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ExportActivityLogs",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B19 ACTIVITY_EXPORT_UNTYPED_ASYNC]: format/filters/download response are raw; reserved, not registered.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ActivityExportResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.activity_logs.ActivityLogsAPI.export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "activity.list",
        "command_path": "activity list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ActivityListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/activity_log",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetActivityLogs",
        "pagination_policy": "offset",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ActivityListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.activity_logs.ActivityLogsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "addon": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.connector.add",
        "command_path": "addon connector add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds paid connector add-ons to the workspace and changes its bill. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonConnectorAddResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/addons/connectors",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddConnectorAddon",
        "pagination_policy": "none",
        "preconditions": "Adds paid connector add-ons to the workspace and changes its bill. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonConnectorAddResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_connector",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.connector.remove",
        "command_path": "addon connector remove",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes paid connector add-ons from the workspace; connections that use them stop working. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonConnectorRemoveResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/addons/connectors",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RemoveConnectorAddon",
        "pagination_policy": "none",
        "preconditions": "Removes paid connector add-ons from the workspace; connections that use them stop working. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonConnectorRemoveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_connector",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.storage.add",
        "command_path": "addon storage add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds paid storage to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonStorageAddResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/addons/storage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddStorageAddon",
        "pagination_policy": "none",
        "preconditions": "Adds paid storage to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonStorageAddResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_storage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.storage.remove",
        "command_path": "addon storage remove",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes paid storage from the workspace; it fails or data becomes read-only if usage exceeds what is left. Check `workspace storage-breakdown` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonStorageRemoveResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/addons/storage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RemoveStorageAddon",
        "pagination_policy": "none",
        "preconditions": "Removes paid storage from the workspace; it fails or data becomes read-only if usage exceeds what is left. Check `workspace storage-breakdown` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonStorageRemoveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_storage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.user.add",
        "command_path": "addon user add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds paid user seats to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonUserAddResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/addons/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddUserSeatsAddon",
        "pagination_policy": "none",
        "preconditions": "Adds paid user seats to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonUserAddResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "addon.user.remove",
        "command_path": "addon user remove",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes paid user seats; fails if more users than seats would remain. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AddonUserRemoveResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/addons/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RemoveUserSeatsAddon",
        "pagination_policy": "none",
        "preconditions": "Removes paid user seats; fails if more users than seats would remain. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonUserRemoveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "agent": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.askers",
        "command_path": "agent access askers",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs a manager of the workspace's AI Agent settings, or someone who manages the project's people. Returns a count.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessAskersResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/projects/{project_id}/askers",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentProjectAskers",
        "pagination_policy": "none",
        "preconditions": "Needs a manager of the workspace's AI Agent settings, or someone who manages the project's people. Returns a count.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessAskersResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_project_askers",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.chart.save",
        "command_path": "agent access chart save",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessChartSaveResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/access/saved-charts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SaveAgentChart",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessChartSaveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_chart_save",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "agent.access.grant.give",
        "command_path": "agent access grant give",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can give access. People outside the workspace are invited as free guests. Needs --yes. Read `agent access grant list` afterwards.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessGrantGiveResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /agents/access/grants",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "GiveAgentAccess",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can give access. People outside the workspace are invited as free guests. Needs --yes. Read `agent access grant list` afterwards.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantGiveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_give",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.grant.list",
        "command_path": "agent access grant list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can list grants.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessGrantListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/grants",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentGrants",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can list grants.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessGrantListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grants_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.grant.revoke",
        "command_path": "agent access grant revoke",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can revoke. Removes the grant at once; the person loses the access. Prompts, or pass --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessGrantRevokeResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /agents/access/grants/{grant_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "RevokeAgentAccess",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can revoke. Removes the grant at once; the person loses the access. Prompts, or pass --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantRevokeResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_revoke",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.grant.update",
        "command_path": "agent access grant update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can change a grant.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessGrantUpdateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /agents/access/grants/{grant_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ChangeAgentAccess",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can change a grant.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.me",
        "command_path": "agent access me",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessMeResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/me",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentAccessMe",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessMeResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_me",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.people",
        "command_path": "agent access people",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can list the people.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessPeopleResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/people",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentPeople",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can list the people.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessPeopleResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_people",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.reach",
        "command_path": "agent access reach",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Anyone reads their own; another person's (user_id) is for managers of the AI Agent settings only.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessReachResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/reach",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentAccessReach",
        "pagination_policy": "none",
        "preconditions": "Anyone reads their own; another person's (user_id) is for managers of the AI Agent settings only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessReachResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_reach",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.request.add-to-context",
        "command_path": "agent access request add-to-context",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: REQUEST_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessRequestAddToContextResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/access/requests/{request_id}/project-context",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddAgentRequestToProjectContext",
        "pagination_policy": "none",
        "preconditions": "Required inputs: REQUEST_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestAddToContextResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_add_to_context",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.request.create",
        "command_path": "agent access request create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessRequestCreateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/access/requests",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateAgentAccessRequest",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestCreateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.request.list",
        "command_path": "agent access request list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can list everyone's requests; `agent access request mine` lists your own.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessRequestListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/requests",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentAccessRequests",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can list everyone's requests; `agent access request mine` lists your own.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessRequestListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_requests_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.request.mine",
        "command_path": "agent access request mine",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessRequestMineResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/requests/mine",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListMyAgentAccessRequests",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessRequestMineResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_requests_mine",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.access.request.resolve",
        "command_path": "agent access request resolve",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Irreversible: a resolved request cannot be reopened, and the requester is told. status is done, declined or dismissed ('open' is refused). Prompts, or pass --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessRequestResolveResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "PATCH /agents/access/requests/{request_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "ResolveAgentAccessRequest",
        "pagination_policy": "none",
        "preconditions": "Irreversible: a resolved request cannot be reopened, and the requester is told. status is done, declined or dismissed ('open' is refused). Prompts, or pass --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestResolveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_resolve",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.settings.get",
        "command_path": "agent access settings get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can read them.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessSettingsGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentSettings",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can read them.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessSettingsGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_settings_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "agent.access.settings.update",
        "command_path": "agent access settings update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can change them. Changes the AI agent for the whole workspace, not one project; only the fields given change. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target). --dry-run reads the current settings and shows each field going from its current to its new value.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentAccessSettingsUpdateResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /agents/access/settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateAgentSettings",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can change them. Changes the AI agent for the whole workspace, not one project; only the fields given change. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target). --dry-run reads the current settings and shows each field going from its current to its new value.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessSettingsUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_settings_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.access.tree",
        "command_path": "agent access tree",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only a manager of the workspace's AI Agent settings can read the tree.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentAccessTreeResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/access/tree",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentAccessTree",
        "pagination_policy": "none",
        "preconditions": "Only a manager of the workspace's AI Agent settings can read the tree.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessTreeResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_tree",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.action.delete",
        "command_path": "agent action delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Deletes the object one recorded action made. The server deletes only an object the chat created (created=true in agent action list), refuses an object the chat only edited or that another object now uses, and re-checks your permission on it. The object goes to the trash, so it can be restored. Prompt or --yes. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentActionDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /agents/sessions/{session_id}/actions/{action_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteAgentSessionAction",
        "pagination_policy": "none",
        "preconditions": "Writes. Deletes the object one recorded action made. The server deletes only an object the chat created (created=true in agent action list), refuses an object the chat only edited or that another object now uses, and re-checks your permission on it. The object goes to the trash, so it can be restored. Prompt or --yes. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentActionDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.action_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.action.list",
        "command_path": "agent action list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists every change the chat session made through the CLI (one row per write: action id, run and step, command, target object, whether the chat created the object, and its state after the write). Read it before agent action delete. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentActionListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/actions",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentSessionActions",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists every change the chat session made through the CLI (one row per write: action id, run and step, command, target object, whether the chat created the object, and its state after the write). Read it before agent action delete. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentActionListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.action_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.chat",
        "command_path": "agent chat",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Scope is {\"type\": \"workspace\", \"workspace_id\": N}, {\"type\": \"user\", \"user_id\": N} or {\"type\": \"account\"}. Put the project the question is about in client_context as {\"project_id\": N}. The command starts the turn and waits for the reply, up to 120 seconds: pass \"wait\": 0 to return at once with the turn id, or a larger \"wait\" for a long turn. If the wait ends first the result has working: true; read the finished reply with agent session messages SESSION_ID. The CLI sends one idempotency key per message and repeats it on a gateway error, so a retry never starts a second turn.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentChatResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AgentChat",
        "pagination_policy": "none",
        "preconditions": "Scope is {\"type\": \"workspace\", \"workspace_id\": N}, {\"type\": \"user\", \"user_id\": N} or {\"type\": \"account\"}. Put the project the question is about in client_context as {\"project_id\": N}. The command starts the turn and waits for the reply, up to 120 seconds: pass \"wait\": 0 to return at once with the turn id, or a larger \"wait\" for a long turn. If the wait ends first the result has working: true; read the finished reply with agent session messages SESSION_ID. The CLI sends one idempotency key per message and repeats it on a gateway error, so a retry never starts a second turn.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentChatResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.chat",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "agent.message.set-request-kind",
        "command_path": "agent message set-request-kind",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Corrects the request kind a reply answered (ask, insight, build, automate or fix). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentMessageSetRequestKindResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /agents/sessions/{session_id}/messages/{message_id}/request-kind",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CorrectAgentRequestKind",
        "pagination_policy": "none",
        "preconditions": "Writes. Corrects the request kind a reply answered (ask, insight, build, automate or fix). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentMessageSetRequestKindResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.message_set_request_kind",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "agent.plan.approve",
        "command_path": "agent plan approve",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. This is the web app's Run it: it approves every proposed step of the chat's current plan and starts the work (paid model work). Typing 'Run it' as a chat message does not approve. The plan_id is read from the session; the request key is made by the CLI. Prompt or --yes. Waits up to wait seconds (default 120; wait 0 returns at once) for the turn. A user control: an embedded chat is refused. agent session messages shows when a chat waits for approval.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "AgentPlanApproveResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Writes. This is the web app's Run it: it approves every proposed step of the chat's current plan and starts the work (paid model work). Typing 'Run it' as a chat message does not approve. The plan_id is read from the session; the request key is made by the CLI. Prompt or --yes. Waits up to wait seconds (default 120; wait 0 returns at once) for the turn. A user control: an embedded chat is refused. agent session messages shows when a chat waits for approval.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanApproveResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "agent.plan.discard",
        "command_path": "agent plan discard",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Marks every proposed step of the chat's current plan skipped; it needs no model turn. The plan_id is read from the session. A user control: an embedded chat is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "AgentPlanDiscardResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Writes. Marks every proposed step of the chat's current plan skipped; it needs no model turn. The plan_id is read from the session. A user control: an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanDiscardResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "agent.plan.edit-proposal",
        "command_path": "agent plan edit-proposal",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Renames or removes one item of the plan's waiting workflow proposal (action rename or remove, the item key, and name for a rename). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentPlanEditProposalResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /agents/sessions/{session_id}/plan/proposal",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditAgentPlanProposal",
        "pagination_policy": "none",
        "preconditions": "Writes. Renames or removes one item of the plan's waiting workflow proposal (action rename or remove, the item key, and name for a rename). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentPlanEditProposalResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.plan_edit_proposal",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "agent.plan.skip",
        "command_path": "agent plan skip",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Marks the proposed plan step N skipped; it needs no model turn. Only a proposed step can be skipped. The plan_id is read from the session. A user control: an embedded chat is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "AgentPlanSkipResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Writes. Marks the proposed plan step N skipped; it needs no model turn. Only a proposed step can be skipped. The plan_id is read from the session. A user control: an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanSkipResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.run.extend",
        "command_path": "agent run extend",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Gives a capped run a fresh time budget (the 8 hour active-time cap). The server refuses extend when this command runs from inside the run itself: a run cannot extend itself, ask the user to extend it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunExtendResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/extend",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExtendAgentRun",
        "pagination_policy": "none",
        "preconditions": "Writes. Gives a capped run a fresh time budget (the 8 hour active-time cap). The server refuses extend when this command runs from inside the run itself: a run cannot extend itself, ask the user to extend it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunExtendResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_extend",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.instance.list",
        "command_path": "agent run instance list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists the agents of the run: the main agent, its workers and recon helpers, with the ids the instance commands take. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunInstanceListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentRunInstances",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists the agents of the run: the main agent, its workers and recon helpers, with the ids the instance commands take. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instances_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.instance.messages",
        "command_path": "agent run instance messages",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The messages one agent of the run sent or received. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunInstanceMessagesResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances/{instance_id}/messages",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentInstanceMessages",
        "pagination_policy": "none",
        "preconditions": "Read-only. The messages one agent of the run sent or received. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceMessagesResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instance_messages",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.instance.transcript",
        "command_path": "agent run instance transcript",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The model messages of one agent of the run, credentials redacted. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunInstanceTranscriptResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances/{instance_id}/transcript",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentInstanceTranscript",
        "pagination_policy": "none",
        "preconditions": "Read-only. The model messages of one agent of the run, credentials redacted. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceTranscriptResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instance_transcript",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.list",
        "command_path": "agent run list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists the runs of the chat session, newest first, with the same fields as agent run status. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/runs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentSessionRuns",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists the runs of the chat session, newest first, with the same fields as agent run status. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.run.pause",
        "command_path": "agent run pause",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Pauses the run after its current call finishes; a waiting run pauses at once. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunPauseResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/pause",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PauseAgentRun",
        "pagination_policy": "none",
        "preconditions": "Writes. Pauses the run after its current call finishes; a waiting run pauses at once. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunPauseResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_pause",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.run.resume",
        "command_path": "agent run resume",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Resumes a paused run from where it stopped. The server refuses resume when this command runs from inside the run itself: a run cannot resume itself, ask the user to resume it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunResumeResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/resume",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ResumeAgentRun",
        "pagination_policy": "none",
        "preconditions": "Writes. Resumes a paused run from where it stopped. The server refuses resume when this command runs from inside the run itself: a run cannot resume itself, ask the user to resume it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunResumeResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_resume",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "agent.run.retry",
        "command_path": "agent run retry",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Retries a failed or stopped run as a new run, which starts paid model work. Session owner only. Prompt or --yes. Needs --session SESSION_ID; an embedded chat is refused.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunRetryResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/retry",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RetryAgentRun",
        "pagination_policy": "none",
        "preconditions": "Writes. Retries a failed or stopped run as a new run, which starts paid model work. Session owner only. Prompt or --yes. Needs --session SESSION_ID; an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunRetryResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_retry",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.status",
        "command_path": "agent run status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Shows the chat session's current durable run: run id, state (running, waiting, paused, capped, done, failed or stopped), the step it is on, what it waits for, and the active time used and left of its 8 hour budget (time spent waiting on you does not count). Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunStatusResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/run",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentSessionRun",
        "pagination_policy": "none",
        "preconditions": "Read-only. Shows the chat session's current durable run: run id, state (running, waiting, paused, capped, done, failed or stopped), the step it is on, what it waits for, and the active time used and left of its 8 hour budget (time spent waiting on you does not count). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunStatusResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_status",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.run.stop",
        "command_path": "agent run stop",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Stops the run and cancels its live step. A stopped run cannot be resumed. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunStopResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/stop",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "StopAgentRun",
        "pagination_policy": "none",
        "preconditions": "Writes. Stops the run and cancels its live step. A stopped run cannot be resumed. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunStopResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_stop",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.run.units.list",
        "command_path": "agent run units list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. One page of the units the run's steps do, optionally only one step (step), one state (queued, running, done, failed or skipped) or from an offset (cursor). Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentRunUnitsListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/units",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentRunUnits",
        "pagination_policy": "none",
        "preconditions": "Read-only. One page of the units the run's steps do, optionally only one step (step), one state (queued, running, done, failed or skipped) or from an offset (cursor). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunUnitsListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_units_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.run.units.set",
        "command_path": "agent run units set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Reports once the objects a plan step will work on (kind is dataset, view and so on; 1 to 1000 units, each id with an optional name and project_id) so the run panel can list them and measure progress and the time left. A unit already listed is left as it is. Needs --session SESSION_ID; an embedded chat supplies it. The server, not the model, counts the units done and the time left.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentRunUnitsSetResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/units",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RegisterAgentRunUnits",
        "pagination_policy": "none",
        "preconditions": "Writes. Reports once the objects a plan step will work on (kind is dataset, view and so on; 1 to 1000 units, each id with an optional name and project_id) so the run panel can list them and measure progress and the time left. A unit already listed is left as it is. Needs --session SESSION_ID; an embedded chat supplies it. The server, not the model, counts the units done and the time left.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunUnitsSetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_units_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.session.delete",
        "command_path": "agent session delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentSessionDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /agents/sessions/{session_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteAgentSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentSessionDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.session.feedback.list",
        "command_path": "agent session feedback list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentSessionFeedbackListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/feedback",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentTurnFeedback",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionFeedbackListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_feedback_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.session.list",
        "command_path": "agent session list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentSessionListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListAgentSessions",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "agent.session.messages",
        "command_path": "agent session messages",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AgentSessionMessagesResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /agents/sessions/{session_id}/messages",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAgentSessionMessages",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionMessagesResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_messages",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.session.set-visibility",
        "command_path": "agent session set-visibility",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentSessionSetVisibilityResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /agents/sessions/{session_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetAgentSessionVisibility",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentSessionSetVisibilityResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_set_visibility",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "agent.turn.cancel",
        "command_path": "agent turn cancel",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes. Stops one turn of the chat session: no further model or tool call starts, the call running is cut, and the turn ends with a stopped event that lists the writes already made. Only the session's owner may; a repeat, or a call after the turn ended, answers the turn's state (stopping, stopped or ended). Needs --session SESSION_ID; an embedded chat supplies it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentTurnCancelResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/turns/{turn_id}/cancel",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CancelAgentTurn",
        "pagination_policy": "none",
        "preconditions": "Writes. Stops one turn of the chat session: no further model or tool call starts, the call running is cut, and the turn ends with a stopped event that lists the writes already made. Only the session's owner may; a repeat, or a call after the turn ended, answers the turn's state (stopping, stopped or ended). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentTurnCancelResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_cancel",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "agent.turn.rate",
        "command_path": "agent turn rate",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AgentTurnRateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /agents/sessions/{session_id}/turns/{turn_id}/feedback",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RateAgentTurn",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentTurnRateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_rate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "ai": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "ai.condition.generate",
        "command_path": "ai condition generate",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AiConditionGenerateResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/condition",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GenerateCondition",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiConditionGenerateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.ai.AIAPI.condition_generate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "ai.expression.generate",
        "command_path": "ai expression generate",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AiExpressionGenerateResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/expression",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GenerateExpression",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiExpressionGenerateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.ai.AIAPI.expression_generate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "start_or_wait",
        "canonical_command": "ai.retention.condition",
        "command_path": "ai retention condition",
        "confirmation": "none",
        "contract": {
          "async": "start_or_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires explicit project context. Mode generate may return a job-backed result; mode test follows the release response union and must not be assumed to synchronously return row counts.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AiRetentionConditionResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/retention_policy",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RetentionCondition",
        "pagination_policy": "none",
        "preconditions": "Requires explicit project context. Mode generate may return a job-backed result; mode test follows the release response union and must not be assumed to synchronously return row counts.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AiRetentionConditionResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.ai.AIAPI.retention_condition",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "start_or_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "ai.sql.generate",
        "command_path": "ai sql generate",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Returns a query and metadata; differs from view transform generate-sql, which adds and executes a pipeline task. Do not infer addon availability from an authorization error.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AiSqlGenerateResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GenerateSql",
        "pagination_policy": "none",
        "preconditions": "Returns a query and metadata; differs from view transform generate-sql, which adds and executes a pipeline task. Do not infer addon availability from an authorization error.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiSqlGenerateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.ai.AIAPI.generate_sql",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "ai.suggestion.list",
        "command_path": "ai suggestion list",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Body is the release UnifiedPromptSpec. suggestion_type is one of extract_text, add_condition, generate_task, apply_ai_template, dashboards, derivative_fuzzy_bucket and params follows that type (generate_task {prompt}; add_condition {prompt, sequence_number}; extract_text {column_name, sequence_number, prompt}). dataset_id/dataview_id scope the request.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AiSuggestionListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/suggestions",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AiSuggestions",
        "pagination_policy": "none",
        "preconditions": "Body is the release UnifiedPromptSpec. suggestion_type is one of extract_text, add_condition, generate_task, apply_ai_template, dashboards, derivative_fuzzy_bucket and params follows that type (generate_task {prompt}; add_condition {prompt, sequence_number}; extract_text {column_name, sequence_number, prompt}). dataset_id/dataview_id scope the request.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiSuggestionListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.ai.AIAPI.get_suggestions",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      }
    ],
    "annotation": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "annotation.comment.add",
        "command_path": "annotation comment add",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: ANNOTATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AnnotationCommentAddResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}/comments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddComment",
        "pagination_policy": "none",
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationCommentAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.comment_add",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "annotation.create",
        "command_path": "annotation create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AnnotationCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/annotations",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateAnnotation",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "annotation.delete",
        "command_path": "annotation delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: ANNOTATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AnnotationDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteAnnotation",
        "pagination_policy": "none",
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "annotation.list",
        "command_path": "annotation list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AnnotationListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/annotations",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListAnnotations",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AnnotationListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "annotation.update",
        "command_path": "annotation update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: ANNOTATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AnnotationUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PatchAnnotation",
        "pagination_policy": "none",
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "auth": [
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "auth.connected-apps.list",
        "command_path": "auth connected-apps list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The apps the signed-in user has authorised; each id is the grant id that auth connected-apps revoke takes.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AuthConnectedAppsListResult",
          "scope": "local",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /self/oauth-grants",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectedApps",
        "pagination_policy": "none",
        "preconditions": "Read-only. The apps the signed-in user has authorised; each id is the grant id that auth connected-apps revoke takes.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthConnectedAppsListResult",
        "scope": "local",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.connected_apps",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "auth.connected-apps.revoke",
        "command_path": "auth connected-apps revoke",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact grant-ID confirmation (--yes --confirm ID). Disconnects the app: its tokens stop working for this user.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AuthConnectedAppsRevokeResult",
          "scope": "local",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /self/oauth-grants/{oauth_grant_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RevokeConnectedApp",
        "pagination_policy": "none",
        "preconditions": "Exact grant-ID confirmation (--yes --confirm ID). Disconnects the app: its tokens stop working for this user.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AuthConnectedAppsRevokeResult",
        "scope": "local",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.revoke_connected_app",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "auth.login",
        "command_path": "auth login",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "AuthLoginResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AuthLoginResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "auth.logout",
        "command_path": "auth logout",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "AuthLogoutResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AuthLogoutResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "auth.status",
        "command_path": "auth status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AuthStatusResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthStatusResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "automation": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.capabilities",
        "command_path": "automation capabilities",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists everything an automation supports, straight from the server: tasks (each with task_type, summary, required_fields, optional_fields, options = accepted values per field, formats_in and formats_out = file formats it reads or writes) and conditions (the triggers: condition_type, summary, fields, options). Answer \"can an automation do X?\" (a PDF, an email attachment, a schedule) from this, never from memory. Then create with `automation create`.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationCapabilitiesResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/capabilities",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAutomationCapabilities",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists everything an automation supports, straight from the server: tasks (each with task_type, summary, required_fields, optional_fields, options = accepted values per field, formats_in and formats_out = file formats it reads or writes) and conditions (the triggers: condition_type, summary, fields, options). Answer \"can an automation do X?\" (a PDF, an email attachment, a schedule) from this, never from memory. Then create with `automation create`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationCapabilitiesResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.capabilities",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "automation.create",
        "command_path": "automation create",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "B15 AUTOMATION_EXTERNAL_EFFECTS: run `automation capabilities` first: it lists every task, trigger, option and file format in and out (PDF included). Task models can pull cloud files and send email; requires connector/email allowlists and dedicated fixtures. Delete old rows on a schedule with task apply_retention_policy (datasource_id, rule_type time_based, count_based or condition_based). The CLI sets require_approval=true on a retention task that omits it (the route defaults to false, an unattended hard delete); require_approval=false with the delete action needs --yes --confirm unattended-delete. An emailed file is task send_an_alert with attachments.dataview_ids: each selected view is emailed as a CSV file. The combined row count of all attached views must stay within 100,000 -- over that, the automation is refused (and a run that grows past it fails).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationCreateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "CreateAutomation",
        "pagination_policy": "none",
        "preconditions": "B15 AUTOMATION_EXTERNAL_EFFECTS: run `automation capabilities` first: it lists every task, trigger, option and file format in and out (PDF included). Task models can pull cloud files and send email; requires connector/email allowlists and dedicated fixtures. Delete old rows on a schedule with task apply_retention_policy (datasource_id, rule_type time_based, count_based or condition_based). The CLI sets require_approval=true on a retention task that omits it (the route defaults to false, an unattended hard delete); require_approval=false with the delete action needs --yes --confirm unattended-delete. An emailed file is task send_an_alert with attachments.dataview_ids: each selected view is emailed as a CSV file. The combined row count of all attached views must stay within 100,000 -- over that, the automation is refused (and a run that grows past it fails).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "automation.delete",
        "command_path": "automation delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteAutomation",
        "pagination_policy": "none",
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.folders",
        "command_path": "automation folders",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Every folder a consolidation automation watches, its rules in order, and the files on their way or waiting on a person.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationFoldersResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/folders",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWatchedFolders",
        "pagination_policy": "none",
        "preconditions": "Read-only. Every folder a consolidation automation watches, its rules in order, and the files on their way or waiting on a person.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationFoldersResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.watched_folders",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.get",
        "command_path": "automation get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Some servers answer this with HTTP 500 and an empty body for an automation that automation create just returned. The automation exists; this is a server error, so do not retry more than once.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAutomation",
        "pagination_policy": "none",
        "preconditions": "Some servers answer this with HTTP 500 and an empty body for an automation that automation create just returned. The automation exists; this is a server error, so do not retry more than once.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.list",
        "command_path": "automation list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetList",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "automation.restore",
        "command_path": "automation restore",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: AUTOMATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationRestoreResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RestoreAutomation",
        "pagination_policy": "none",
        "preconditions": "Required inputs: AUTOMATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRestoreResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "automation.route.order",
        "command_path": "automation route order",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "`automation_ids` names the folder's own rules, first rule first; files dropped after the change meet them in that order.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationRouteOrderResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /workspaces/{workspace_id}/projects/{project_id}/automations/route-order",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetRouteOrder",
        "pagination_policy": "none",
        "preconditions": "`automation_ids` names the folder's own rules, first rule first; files dropped after the change meet them in that order.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRouteOrderResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.set_route_order",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.route.preview",
        "command_path": "automation route preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists the folder's rules (its own, then inherited) and where files of the given `names` would go; a `draft` rule also says how many recent files it would take.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationRoutePreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/route-preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "PreviewRoutes",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists the folder's rules (its own, then inherited) and where files of the given `names` would go; a `draft` rule also says how many recent files it would take.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationRoutePreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.preview_routes",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "automation.run-file.add-anyway",
        "command_path": "automation run-file add-anyway",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Appends a file a run skipped as a duplicate to its destination dataset; find the run file id with `automation runs`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationRunFileAddAnywayResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/run-files/{run_file_id}/add-anyway",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddRunFileAnyway",
        "pagination_policy": "none",
        "preconditions": "Appends a file a run skipped as a duplicate to its destination dataset; find the run file id with `automation runs`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRunFileAddAnywayResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.add_run_file_anyway",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "automation.runs",
        "command_path": "automation runs",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Newest first, each run with its files; `limit` is capped at 50 by the server.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AutomationRunsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/runs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAutomationRuns",
        "pagination_policy": "none",
        "preconditions": "Read-only. Newest first, each run with its files; `limit` is capped at 50 by the server.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationRunsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.runs",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "automation.trash",
        "command_path": "automation trash",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: AUTOMATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationTrashResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TrashAutomation",
        "pagination_policy": "none",
        "preconditions": "Required inputs: AUTOMATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationTrashResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.trash",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "automation.update",
        "command_path": "automation update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes a live automation (run, status, retention approval): read it first (`automation get`). Needs --yes. Each patch item is op + path + value: `command` + `run` (run now), `replace` + `status` (`suspend` or `resume`), `replace` + `details` (an object with at least one of name, description, tasks, conditions). Paths are details, run, status, approve_retention, reject_retention. On a data-refresh automation, --input with add_datasets and remove_datasets (lists of dataset ids) changes its datasets without a patch list.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "AutomationUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "UpdateAutomation",
        "pagination_policy": "none",
        "preconditions": "Changes a live automation (run, status, retention approval): read it first (`automation get`). Needs --yes. Each patch item is op + path + value: `command` + `run` (run now), `replace` + `status` (`suspend` or `resume`), `replace` + `details` (an object with at least one of name, description, tasks, conditions). Paths are details, run, status, approve_retention, reject_retention. On a data-refresh automation, --input with add_datasets and remove_datasets (lists of dataset ids) changes its datasets without a patch list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.automations.AutomationsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "batch": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "batch.bulk-delete",
        "command_path": "batch bulk-delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "ids is required (the backend rejects a delete with no batch ids; it never deletes all batches). List ids with batch list.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BatchBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteBatches",
        "pagination_policy": "none",
        "preconditions": "ids is required (the backend rejects a delete with no batch ids; it never deletes all batches). List ids with batch list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.bulk_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "returns_job",
        "canonical_command": "batch.create",
        "command_path": "batch create",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Every source column must be mapped to an existing destination column; the CLI reads both schemas and refuses (append_mapping_incomplete) an unmapped source column or a destination the dataset lacks, because the backend appends only mapped columns. A destination column no mapping item fills (add_column items count) would be NULL in every appended row, so it is refused (append_leaves_columns_blank) unless the input lists exactly those names in blank_columns; the confirmed blanks are named in mapping_check.warnings. The CLI sends each item's expected_destination_c_type as the destination's current type (never re-types it; an explicit different value is refused with append_type_mismatch) and warns in mapping_check.warnings when source and destination types differ. SOURCE_ID is a standalone dataset in the same project (4BATC010 INVALID_SOURCE_DATASET for a file id or an append child); to append a file use file upload with append_to_ds_id. delete_source_ds=true changes the mutation class to destructive and requires confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BatchCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateBatch",
        "pagination_policy": "none",
        "preconditions": "Every source column must be mapped to an existing destination column; the CLI reads both schemas and refuses (append_mapping_incomplete) an unmapped source column or a destination the dataset lacks, because the backend appends only mapped columns. A destination column no mapping item fills (add_column items count) would be NULL in every appended row, so it is refused (append_leaves_columns_blank) unless the input lists exactly those names in blank_columns; the confirmed blanks are named in mapping_check.warnings. The CLI sends each item's expected_destination_c_type as the destination's current type (never re-types it; an explicit different value is refused with append_type_mismatch) and warns in mapping_check.warnings when source and destination types differ. SOURCE_ID is a standalone dataset in the same project (4BATC010 INVALID_SOURCE_DATASET for a file id or an append child); to append a file use file upload with append_to_ds_id. delete_source_ds=true changes the mutation class to destructive and requires confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "batch.create-spec",
        "command_path": "batch create-spec",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Release BatchesPostRequest; file_id-only or source_id plus homogeneous mapping array. Dynamic confirmation applies only to delete_source_ds.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "BatchCreateSpecResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Release BatchesPostRequest; file_id-only or source_id plus homogeneous mapping array. Dynamic confirmation applies only to delete_source_ds.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "BatchCreateSpecResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "returns_job",
        "canonical_command": "batch.delete",
        "command_path": "batch delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "returns_job",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Resolve the batch before confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BatchDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteBatch",
        "pagination_policy": "none",
        "preconditions": "Resolve the batch before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "batch.get",
        "command_path": "batch get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID, BATCH_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BatchGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetBatch",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID, BATCH_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BatchGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "batch.list",
        "command_path": "batch list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BatchListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetBatches",
        "pagination_policy": "offset",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BatchListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "returns_job",
        "canonical_command": "batch.update",
        "command_path": "batch update",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The server takes one patch operation per call: {\"patch\": {\"op\": \"replace\", \"path\": \"batches\", \"value\": {\"suspend\": [BATCH_ID], \"restore\": [BATCH_ID]}}} (a list holding that one operation is also accepted; \"path\" defaults to batches). Any remove operation in the patch changes the mutation class to destructive.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BatchUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateBatches",
        "pagination_policy": "none",
        "preconditions": "The server takes one patch operation per call: {\"patch\": {\"op\": \"replace\", \"path\": \"batches\", \"value\": {\"suspend\": [BATCH_ID], \"restore\": [BATCH_ID]}}} (a list holding that one operation is also accepted; \"path\" defaults to batches). Any remove operation in the patch changes the mutation class to destructive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.batches.BatchesAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      }
    ],
    "billing": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.chargebee-plan",
        "command_path": "billing chargebee-plan",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingChargebeePlanResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/chargebee-plan",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetChargebeePlan",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingChargebeePlanResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.chargebee_plan",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.hosted-page",
        "command_path": "billing hosted-page",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Creates a hosted billing page URL for object_type (for example change_plan). Nothing changes until someone completes the page. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingHostedPageResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription_v1/hosted-page",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "FetchHostedPage",
        "pagination_policy": "none",
        "preconditions": "Creates a hosted billing page URL for object_type (for example change_plan). Nothing changes until someone completes the page. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingHostedPageResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.hosted_page",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.invoice.charge",
        "command_path": "billing invoice charge",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Charges the workspace's open invoice to its saved payment method now; money moves. Read `billing stripe status` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingInvoiceChargeResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/invoices/charge",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ChargeWorkspaceInvoices",
        "pagination_policy": "none",
        "preconditions": "Charges the workspace's open invoice to its saved payment method now; money moves. Read `billing stripe status` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingInvoiceChargeResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.invoice_charge",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "billing.invoice.list",
        "command_path": "billing invoice list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingInvoiceListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingInvoiceListResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.cancel",
        "command_path": "billing stripe cancel",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Cancels the workspace subscription at the billing provider. Read `billing stripe status` first; `billing stripe resume` reverses a pending cancel. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeCancelResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/cancel",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CancelWorkspaceSubscription",
        "pagination_policy": "none",
        "preconditions": "Cancels the workspace subscription at the billing provider. Read `billing stripe status` first; `billing stripe resume` reverses a pending cancel. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCancelResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_cancel",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.checkout-url",
        "command_path": "billing stripe checkout-url",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Creates a checkout URL (success_url and cancel_url are required); nothing is charged until someone completes it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeCheckoutUrlResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/create-checkout",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateCheckoutUrl",
        "pagination_policy": "none",
        "preconditions": "Creates a checkout URL (success_url and cancel_url are required); nothing is charged until someone completes it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCheckoutUrlResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_checkout_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.create",
        "command_path": "billing stripe create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateWorkspaceSubscription",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.end-trial",
        "command_path": "billing stripe end-trial",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Ends the workspace's free trial now and starts billing; the CLI cannot undo it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeEndTrialResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/end-trial",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "EndTrialAndStartSubscription",
        "pagination_policy": "none",
        "preconditions": "Ends the workspace's free trial now and starts billing; the CLI cannot undo it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeEndTrialResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_end_trial",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.get",
        "command_path": "billing stripe get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaceSubscription",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.held-change.cancel",
        "command_path": "billing stripe held-change cancel",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Irreversible: voids the unpaid invoice of the plan change the workspace is holding. If that invoice was already paid, the change is applied instead and the result says landed: true. Read `billing stripe held-change get` first; the confirmation and --dry-run name the held plan. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeHeldChangeCancelResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "POST /workspaces/{workspace_id}/subscription/held-change/cancel",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "CancelHeldChange",
        "pagination_policy": "none",
        "preconditions": "Irreversible: voids the unpaid invoice of the plan change the workspace is holding. If that invoice was already paid, the change is applied instead and the result says landed: true. Read `billing stripe held-change get` first; the confirmation and --dry-run name the held plan. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeHeldChangeCancelResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_held_change_cancel",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.held-change.get",
        "command_path": "billing stripe held-change get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Answers not found when no plan change is waiting for payment.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeHeldChangeGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/held-change",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetHeldChange",
        "pagination_policy": "none",
        "preconditions": "Answers not found when no plan change is waiting for payment.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeHeldChangeGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_held_change_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.history",
        "command_path": "billing stripe history",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeHistoryResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/billing-history",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaceBillingHistory",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeHistoryResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_history",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.payment-method.delete",
        "command_path": "billing stripe payment-method delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripePaymentMethodDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/subscription/payment-methods/{payment_method_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeletePaymentMethod",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePaymentMethodDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.payment-method.list",
        "command_path": "billing stripe payment-method list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripePaymentMethodListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/payment-methods",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPaymentMethods",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripePaymentMethodListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.payment-method.set-default",
        "command_path": "billing stripe payment-method set-default",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripePaymentMethodSetDefaultResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/payment-methods/default",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SetDefaultPaymentMethod",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePaymentMethodSetDefaultResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_set_default",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.portal-url",
        "command_path": "billing stripe portal-url",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Creates a customer-portal link that grants access to the workspace's billing; do not log or share it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripePortalUrlResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/customer-portal",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateCustomerPortalUrl",
        "pagination_policy": "none",
        "preconditions": "Creates a customer-portal link that grants access to the workspace's billing; do not log or share it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePortalUrlResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_portal_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.preview-invoice",
        "command_path": "billing stripe preview-invoice",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripePreviewInvoiceResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/preview-invoice",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "PreviewInvoice",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripePreviewInvoiceResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_preview_invoice",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "billing.stripe.recheck-limits",
        "command_path": "billing stripe recheck-limits",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Recomputes which plan limits the workspace exceeds and stores the over-limit lock (over_limit_info: over_limit, items, advisory). Run it after deleting items; the lock clears once everything is under the limits. Safe to repeat.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeRecheckLimitsResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/subscription/recheck-limits",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RecheckWorkspaceLimits",
        "pagination_policy": "none",
        "preconditions": "Recomputes which plan limits the workspace exceeds and stores the over-limit lock (over_limit_info: over_limit, items, advisory). Run it after deleting items; the lock clears once everything is under the limits. Safe to repeat.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeRecheckLimitsResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_recheck_limits",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.resume",
        "command_path": "billing stripe resume",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Keep the paid plan: clears a scheduled cancel-at-period-end downgrade, so the workspace does not move to Free at period end. With nothing scheduled the message says so and nothing changes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeResumeResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/resume",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ResumeWorkspaceSubscription",
        "pagination_policy": "none",
        "preconditions": "Keep the paid plan: clears a scheduled cancel-at-period-end downgrade, so the workspace does not move to Free at period end. With nothing scheduled the message says so and nothing changes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeResumeResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_resume",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.retry-payment",
        "command_path": "billing stripe retry-payment",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Retries the failed payment on the workspace's latest invoice; money moves if it succeeds. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeRetryPaymentResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/retry-payment",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RetryPayment",
        "pagination_policy": "none",
        "preconditions": "Retries the failed payment on the workspace's latest invoice; money moves if it succeeds. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeRetryPaymentResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_retry_payment",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.status",
        "command_path": "billing stripe status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeStatusResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/status",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaceSubscriptionStatus",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeStatusResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_status",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.storage.set",
        "command_path": "billing stripe storage set",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sets the TOTAL purchased storage in GB (the plan's included storage or one of its storage options), not an increment. Inline-pricing plans only; the subscription is re-priced and the difference invoiced at once. Preview the cost first with billing stripe preview-invoice.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeStorageSetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /workspaces/{workspace_id}/subscription/storage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateSubscriptionStorage",
        "pagination_policy": "none",
        "preconditions": "Sets the TOTAL purchased storage in GB (the plan's included storage or one of its storage options), not an increment. Inline-pricing plans only; the subscription is re-priced and the difference invoiced at once. Preview the cost first with billing stripe preview-invoice.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeStorageSetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_storage_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.sync",
        "command_path": "billing stripe sync",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Re-reads the subscription from the billing provider and overwrites Mammoth's copy of plan and status. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingStripeSyncResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/subscription/sync",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SyncSubscription",
        "pagination_policy": "none",
        "preconditions": "Re-reads the subscription from the billing provider and overwrites Mammoth's copy of plan and status. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeSyncResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_sync",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.upcoming-invoice",
        "command_path": "billing stripe upcoming-invoice",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeUpcomingInvoiceResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/upcoming-invoice",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUpcomingInvoice",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeUpcomingInvoiceResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_upcoming_invoice",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.stripe.usage",
        "command_path": "billing stripe usage",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingStripeUsageResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription/usage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaceUsage",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeUsageResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_usage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.subscription.get",
        "command_path": "billing subscription get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BillingSubscriptionGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/subscription_v1",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWkspSubscriptionDetail",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingSubscriptionGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.subscription_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "billing.subscription.update",
        "command_path": "billing subscription update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Plans: storage 1 GB Free, 10 GB Starter, 50 GB Pro; users 1, 5, 10.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "BillingSubscriptionUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/subscription_v1",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateSubscriptionDetail",
        "pagination_policy": "none",
        "preconditions": "Plans: storage 1 GB Free, 10 GB Starter, 50 GB Pro; users 1, 5, 10.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingSubscriptionUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.billing.BillingAPI.subscription_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "browse": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.ancestors",
        "command_path": "browse ancestors",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The folder path (breadcrumb) of a FOLDER of the active project: the chain from the project root down to the folder itself, root first (resources v2). Pass the folder's resource_id from browse resources, not its object id. Any other id answers 404; 0 means the project root and returns an empty path. For a dataset or view, take its parent_resource_id first.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseAncestorsResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources/ancestors",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetResourceAncestors",
        "pagination_policy": "none",
        "preconditions": "The folder path (breadcrumb) of a FOLDER of the active project: the chain from the project root down to the folder itself, root first (resources v2). Pass the folder's resource_id from browse resources, not its object id. Any other id answers 404; 0 means the project root and returns an empty path. For a dataset or view, take its parent_resource_id first.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseAncestorsResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.resource_ancestors",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.folder",
        "command_path": "browse folder",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Validate level and add continuation only if proven.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseFolderResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}/browse",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "BrowseFolderFolders",
        "pagination_policy": "single_page",
        "preconditions": "Validate level and add continuation only if proven.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseFolderResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.folder_resources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.project",
        "command_path": "browse project",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Some servers answer this with HTTP 500; that is a server error, not server_unavailable.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseProjectResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/browse",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "BrowseProjectProjects",
        "pagination_policy": "offset",
        "preconditions": "Some servers answer this with HTTP 500; that is a server error, not server_unavailable.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseProjectResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.browse",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.resource",
        "command_path": "browse resource",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "One resource of the project with its full properties (resources v2); name the type, then the id.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseResourceResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources/{resource_type}/{object_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetResource",
        "pagination_policy": "none",
        "preconditions": "One resource of the project with its full properties (resources v2); name the type, then the id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourceResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.resource_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.resources",
        "command_path": "browse resources",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "cursor"
          },
          "preconditions": "One project's resources a cursor page at a time (resources v2): pass next_cursor back as cursor while has_more is true. Optional parent_type and parent_id list inside a folder; resource_type, search, sort and fields narrow the page.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseResourcesResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources",
        "limits": {
          "continuation": "not_proven",
          "pagination": "cursor"
        },
        "mutation_class": "read",
        "operation_id": "ListResources",
        "pagination_policy": "cursor",
        "preconditions": "One project's resources a cursor page at a time (resources v2): pass next_cursor back as cursor while has_more is true. Optional parent_type and parent_id list inside a folder; resource_type, search, sort and fields narrow the page.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourcesResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.resources.bulk",
        "command_path": "browse resources bulk",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Gets many resources of the active project by type and id in one request (resources v2; 100 pairs per request, more are chunked). Pass items in --input as [type, id] pairs, for example [[\"dataview\", 42]]. A pair that does not exist in the project, or that you cannot read, is left out of the answer.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseResourcesBulkResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/resources/bulk",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "BulkGetResources",
        "pagination_policy": "none",
        "preconditions": "Gets many resources of the active project by type and id in one request (resources v2; 100 pairs per request, more are chunked). Pass items in --input as [type, id] pairs, for example [[\"dataview\", 42]]. A pair that does not exist in the project, or that you cannot read, is left out of the answer.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourcesBulkResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_bulk",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.root",
        "command_path": "browse root",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseRootResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /browse",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "BrowseResources",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseRootResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.root",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.search",
        "command_path": "browse search",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "cursor"
          },
          "preconditions": "Searches resources across every project you can open in the workspace (resources v2), a cursor page at a time: pass next_cursor back as cursor while has_more is true. search matches names; resource_type (comma-separated), sort and fields narrow the page. Needs no active project. Each dataset hit carries dataset_id (its object_id) and each view hit view_id: pass those, never the tree id.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseSearchResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/resources",
        "limits": {
          "continuation": "not_proven",
          "pagination": "cursor"
        },
        "mutation_class": "read",
        "operation_id": "SearchResources",
        "pagination_policy": "cursor",
        "preconditions": "Searches resources across every project you can open in the workspace (resources v2), a cursor page at a time: pass next_cursor back as cursor while has_more is true. search matches names; resource_type (comma-separated), sort and fields narrow the page. Needs no active project. Each dataset hit carries dataset_id (its object_id) and each view hit view_id: pass those, never the tree id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseSearchResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_search",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "browse.workspace",
        "command_path": "browse workspace",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Validate level against the OpenAPI enum and report truncation.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "BrowseWorkspaceResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/browse",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "BrowseWorkspaceWorkspaces",
        "pagination_policy": "single_page",
        "preconditions": "Validate level against the OpenAPI enum and report truncation.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseWorkspaceResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.browse.BrowseAPI.workspace_resources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "capability": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "capability.find",
        "command_path": "capability find",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Required inputs: QUERY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CapabilityFindResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "offset",
        "preconditions": "Required inputs: QUERY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityFindResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "capability.get",
        "command_path": "capability get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: OPERATION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CapabilityGetResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: OPERATION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityGetResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "capability.list",
        "command_path": "capability list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CapabilityListResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityListResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "client-app": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "client-app.create",
        "command_path": "client-app create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The app key and token are shown once, in this response only; store them at once. They are redacted from logs and diagnostics. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ClientAppCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/clientapps",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateApp",
        "pagination_policy": "none",
        "preconditions": "The app key and token are shown once, in this response only; store them at once. They are redacted from logs and diagnostics. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "client-app.delete",
        "command_path": "client-app delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes the client app and invalidates its key for good. Needs --yes and --confirm CLIENT_KEY (the exact key).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ClientAppDeleteResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/clientapps/{client_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteApp",
        "pagination_policy": "none",
        "preconditions": "Deletes the client app and invalidates its key for good. Needs --yes and --confirm CLIENT_KEY (the exact key).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "client-app.get",
        "command_path": "client-app get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "client_key is a secret-bearing identifier and is redacted in diagnostics.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ClientAppGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/clientapps/{client_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AppDetails",
        "pagination_policy": "none",
        "preconditions": "client_key is a secret-bearing identifier and is redacted in diagnostics.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "client-app.list",
        "command_path": "client-app list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Lists the workspace's client apps.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ClientAppListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/clientapps",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "ListApps",
        "pagination_policy": "offset",
        "preconditions": "Lists the workspace's client apps.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "client-app.update",
        "command_path": "client-app update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B21 CLIENT_APP_PATCH_UNCONSTRAINED]: op/path/value are arbitrary strings; reserved, not registered.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ClientAppUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/clientapps/{client_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateApp",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B21 CLIENT_APP_PATCH_UNCONSTRAINED]: op/path/value are arbitrary strings; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "collection": [
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.active-job",
        "command_path": "collection active-job",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Returns the collection's upload job that is still in flight, so an interrupted upload can be resumed. Use collection job to poll one job by id.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionActiveJobResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/active-job",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ActiveJob",
        "pagination_policy": "none",
        "preconditions": "Read-only. Returns the collection's upload job that is still in flight, so an interrupted upload can be resumed. Use collection job to poll one job by id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionActiveJobResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.active_job",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.activity",
        "command_path": "collection activity",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Who opened the collection and which of its dashboards get opened: opened, member_count, people (email, status, last_opened_at) and dashboards (views, viewers).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionActivityResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/activity",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "CollectionActivity",
        "pagination_policy": "none",
        "preconditions": "Read-only. Who opened the collection and which of its dashboards get opened: opened, member_count, people (email, status, last_opened_at) and dashboards (views, viewers).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionActivityResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.activity",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.create",
        "command_path": "collection create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Creates a collection in the active project (--project, or input project_id). name is 1 to 120 characters; dashboard_ids puts boards in it, in order. Nobody else sees it until collection share.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionCreateResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /collections",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateCollection",
        "pagination_policy": "none",
        "preconditions": "Creates a collection in the active project (--project, or input project_id). name is 1 to 120 characters; dashboard_ids puts boards in it, in order. Nobody else sees it until collection share.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionCreateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.dashboards.add",
        "command_path": "collection dashboards add",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds dashboards to the collection, which gives its members access to them. notify true also emails the members. Always needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionDashboardsAddResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /collections/{collection_id}/dashboards",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "AddDashboards",
        "pagination_policy": "none",
        "preconditions": "Adds dashboards to the collection, which gives its members access to them. notify true also emails the members. Always needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDashboardsAddResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.add_dashboards",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.dashboards.remove",
        "command_path": "collection dashboards remove",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Takes one dashboard out of the collection. The dashboard is kept.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionDashboardsRemoveResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /collections/{collection_id}/dashboards/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "RemoveDashboard",
        "pagination_policy": "none",
        "preconditions": "Takes one dashboard out of the collection. The dashboard is kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDashboardsRemoveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.remove_dashboard",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.delete",
        "command_path": "collection delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes the collection and ends every member's access through it. The dashboards in it are kept.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionDeleteResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /collections/{collection_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteCollection",
        "pagination_policy": "none",
        "preconditions": "Deletes the collection and ends every member's access through it. The dashboards in it are kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "collection.email-updates.get",
        "command_path": "collection email-updates get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: COLLECTION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionEmailUpdatesGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/email-updates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCollectionEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Required inputs: COLLECTION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionEmailUpdatesGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.email_updates",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "collection.email-updates.me.get",
        "command_path": "collection email-updates me get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: COLLECTION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionEmailUpdatesMeGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/email-updates/me",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetMyCollectionEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Required inputs: COLLECTION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionEmailUpdatesMeGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.my_email_updates",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.email-updates.me.set",
        "command_path": "collection email-updates me set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Turns your own email updates for the collection on or off; nobody else's.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionEmailUpdatesMeSetResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /collections/{collection_id}/email-updates/me",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetMyCollectionEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Turns your own email updates for the collection on or off; nobody else's.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesMeSetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.set_my_email_updates",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "collection.email-updates.set",
        "command_path": "collection email-updates set",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Saves the collection's email-update schedule and the phone numbers or people it reaches. Needs --yes. Editors only.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionEmailUpdatesSetResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PUT /collections/{collection_id}/email-updates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "SaveCollectionEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Saves the collection's email-update schedule and the phone numbers or people it reaches. Needs --yes. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesSetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.set_email_updates",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "collection.email-updates.test",
        "command_path": "collection email-updates test",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sends a real test email update right away. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionEmailUpdatesTestResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /collections/{collection_id}/email-updates/test",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "TestCollectionEmailUpdate",
        "pagination_policy": "none",
        "preconditions": "Sends a real test email update right away. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesTestResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.send_test_email_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.files.upload",
        "command_path": "collection files upload",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Uploads local files to refresh the collection's data. Input files is the list of paths; append_to_ds_id appends to one of the refresh datasets. The server answers with an upload job id and refreshes in the background.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionFilesUploadResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /collections/{collection_id}/files",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UploadFile",
        "pagination_policy": "none",
        "preconditions": "Uploads local files to refresh the collection's data. Input files is the list of paths; append_to_ds_id appends to one of the refresh datasets. The server answers with an upload job id and refreshes in the background.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionFilesUploadResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.upload_files",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.for-dashboard",
        "command_path": "collection for-dashboard",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The collections that hold this dashboard, in the shape collection list returns.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionForDashboardResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/for-dashboard/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "CollectionsForDashboard",
        "pagination_policy": "none",
        "preconditions": "Read-only. The collections that hold this dashboard, in the shape collection list returns.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionForDashboardResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.for_dashboard",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.get",
        "command_path": "collection get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. One collection with its dashboards in order, its members (managers only), and its refresh setup.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionGetResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCollection",
        "pagination_policy": "none",
        "preconditions": "Read-only. One collection with its dashboards in order, its members (managers only), and its refresh setup.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.get-by-url",
        "command_path": "collection get-by-url",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Opens a collection by its share url token, as a viewer does. Input t is the invite token, which the server redeems on the way in; email is the address the invite went to.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionGetByUrlResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/url/{url}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCollectionByUrl",
        "pagination_policy": "none",
        "preconditions": "Read-only. Opens a collection by its share url token, as a viewer does. Input t is the invite token, which the server redeems on the way in; email is the address the invite went to.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionGetByUrlResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.get_by_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.job",
        "command_path": "collection job",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Polls one collection upload job by id and returns its state.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionJobResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/jobs/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetRefreshJob",
        "pagination_policy": "none",
        "preconditions": "Read-only. Polls one collection upload job by id and returns its state.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionJobResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.job",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.list",
        "command_path": "collection list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The collections you manage or were shared, each with its role (manager or member), url, project and dashboard count.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionListResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListCollections",
        "pagination_policy": "none",
        "preconditions": "Read-only. The collections you manage or were shared, each with its role (manager or member), url, project and dashboard count.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.members.remove",
        "command_path": "collection members remove",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Takes one person off the collection by email.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionMembersRemoveResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /collections/{collection_id}/members",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "RemoveMember",
        "pagination_policy": "none",
        "preconditions": "Takes one person off the collection by email.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionMembersRemoveResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.remove_member",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.pipeline-changes",
        "command_path": "collection pipeline-changes",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Progress of the collection's data refresh; empty when no automation is linked.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CollectionPipelineChangesResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /collections/{collection_id}/pipeline-changes",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "PipelineChanges",
        "pagination_policy": "none",
        "preconditions": "Read-only. Progress of the collection's data refresh; empty when no automation is linked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionPipelineChangesResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.pipeline_changes",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.share",
        "command_path": "collection share",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Gives people access to the collection by email and sends them the invite. The result lists added, already (members before) and in_project (skipped: they already edit the project's boards). Always needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionShareResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /collections/{collection_id}/share",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "ShareCollection",
        "pagination_policy": "none",
        "preconditions": "Gives people access to the collection by email and sends them the invite. The result lists added, already (members before) and in_project (skipped: they already edit the project's boards). Always needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionShareResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.share",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "collection.update",
        "command_path": "collection update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes only the fields given: name, description, order (every dashboard id, in the new order), tab_labels (dashboard id to a short label; empty clears it), automation_id to link the upload-to-refresh automation, or unlink_automation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "CollectionUpdateResult",
          "scope": "profile",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /collections/{collection_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateCollection",
        "pagination_policy": "none",
        "preconditions": "Changes only the fields given: name, description, order (every dashboard id, in the new order), tab_labels (dashboard id to a short label; empty clears it), automation_id to link the upload-to-refresh automation, or unlink_automation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.collections.CollectionsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      }
    ],
    "completion": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "completion.install",
        "command_path": "completion install",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "CompletionInstallResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "CompletionInstallResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "completion.show",
        "command_path": "completion show",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CompletionShowResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CompletionShowResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "config": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "config.get",
        "command_path": "config get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: KEY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConfigGetResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigGetResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "config.list",
        "command_path": "config list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConfigListResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigListResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "config.path",
        "command_path": "config path",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConfigPathResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigPathResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "config.set",
        "command_path": "config set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: KEY, VALUE.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ConfigSetResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: KEY, VALUE.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ConfigSetResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "connector": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.active",
        "command_path": "connector active",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorActiveResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/active_connectors",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetActiveConnectors",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorActiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.active_connectors",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.ai.chat",
        "command_path": "connector ai chat",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorAiChatResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "Chat",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiChatResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.chat",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.ai.history",
        "command_path": "connector ai history",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTION_KEY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorAiHistoryResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/history",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetChatHistory",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTION_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiHistoryResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.history",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.ai.session.list",
        "command_path": "connector ai session list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorAiSessionListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/sessions",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSessions",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiSessionListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.session_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.ai.session.messages",
        "command_path": "connector ai session messages",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorAiSessionMessagesResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/sessions/{session_id}/messages",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSessionMessages",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiSessionMessagesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.session_messages",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.ai.submit-column-selection",
        "command_path": "connector ai submit-column-selection",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorAiSubmitColumnSelectionResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/column-selection",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SubmitColumnSelection",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiSubmitColumnSelectionResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.submit_column_selection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.ai.submit-credentials",
        "command_path": "connector ai submit-credentials",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorAiSubmitCredentialsResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/credentials",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SubmitCredentials",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiSubmitCredentialsResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.submit_credentials",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "connector.connection.create",
        "command_path": "connector connection create",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The connection document depends on connector_key (see `connector get KEY` for its fields); credentials in it are secrets, so pass them through a protected --input FILE.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorConnectionCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "SaveConnection",
        "pagination_policy": "none",
        "preconditions": "The connection document depends on connector_key (see `connector get KEY` for its fields); credentials in it are secrets, so pass them through a protected --input FILE.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.create_connection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.connection.delete",
        "command_path": "connector connection delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Resolve immutable key before confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorConnectionDeleteResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteConnection",
        "pagination_policy": "none",
        "preconditions": "Resolve immutable key before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.delete_connection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.connection.get",
        "command_path": "connector connection get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Secrets in the returned config are redacted. Without --project it looks for the project that holds the connection; when none or several do, it fails with project_required and names them.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorConnectionGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetConnection",
        "pagination_policy": "none",
        "preconditions": "Secrets in the returned config are redacted. Without --project it looks for the project that holds the connection; when none or several do, it fails with project_required and names them.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get_connection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.connection.list",
        "command_path": "connector connection list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Without a connector key the result lists the connections of every connector in 'connector active', each row with its connector_key. Secrets in a connection's config are redacted.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorConnectionListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListConnections",
        "pagination_policy": "single_page",
        "preconditions": "Without a connector key the result lists the connections of every connector in 'connector active', each row with its connector_key. Secrets in a connection's config are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_connections",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.connection.list-all",
        "command_path": "connector connection list-all",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorConnectionListAllResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connections",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListAllConnections",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionListAllResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_all_connections",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "connector.connection.query",
        "command_path": "connector connection query",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Runs one SELECT on the connected database and returns a sample of its rows in data_sample (dataschema and rows). It saves no data source configuration and creates no dataset, so it needs no --yes; Mammoth keeps only the short-lived job that carried the request. The CLI refuses anything but a single SELECT or WITH ... SELECT, and the connection's database user decides what the database allows. The sample is limited to the first rows of the result, so add your own LIMIT or aggregate for a large table. To turn a query into a dataset use dataset create.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorConnectionQueryResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "single_page",
        "preconditions": "Runs one SELECT on the connected database and returns a sample of its rows in data_sample (dataschema and rows). It saves no data source configuration and creates no dataset, so it needs no --yes; Mammoth keeps only the short-lived job that carried the request. The CLI refuses anything but a single SELECT or WITH ... SELECT, and the connection's database user decides what the database allows. The sample is limited to the first rows of the result, so add your own LIMIT or aggregate for a large table. To turn a query into a dataset use dataset create.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionQueryResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.connection.test",
        "command_path": "connector connection test",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs project admin; the check reaches the connection's own service and its result is kept.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorConnectionTestResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connections/{connection_key}/test",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TestConnection",
        "pagination_policy": "none",
        "preconditions": "Needs project admin; the check reaches the connection's own service and its result is kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionTestResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.test_connection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "connector.connection.update",
        "command_path": "connector connection update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs --yes if validation contacts the destination.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorConnectionUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "UpdateConnection",
        "pagination_policy": "none",
        "preconditions": "Needs --yes if validation contacts the destination.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.update_connection",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.browse",
        "command_path": "connector draft browse",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. A files-shaped source only; for Google Sheets it lists the account's recent spreadsheets.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftBrowseResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/browse",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "BrowseConnectorDraftFolderConnectorDrafts",
        "pagination_policy": "none",
        "preconditions": "Read-only. A files-shaped source only; for Google Sheets it lists the account's recent spreadsheets.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftBrowseResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.browse",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.create",
        "command_path": "connector draft create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Without `session_id` the server starts an agent chat for the draft. A draft with no `connection_key` needs the project admin role. Another live draft for the same connector or connection comes back as `resume_candidate`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftCreateResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateConnectorDraft",
        "pagination_policy": "none",
        "preconditions": "Without `session_id` the server starts an agent chat for the draft. A draft with no `connection_key` needs the project admin role. Another live draft for the same connector or connection comes back as `resume_candidate`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.discard",
        "command_path": "connector draft discard",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Hides the draft from every list; its chat thread stays.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftDiscardResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DiscardConnectorDraft",
        "pagination_policy": "none",
        "preconditions": "Hides the draft from every list; its chat thread stays.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftDiscardResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.discard",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.fill",
        "command_path": "connector draft fill",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Pass exactly one of `file_object_id` or `dataset_id`. 409 while the file is still being read; retry once it is.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftFillResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/fill",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "FillConnectorDraftGap",
        "pagination_policy": "none",
        "preconditions": "Pass exactly one of `file_object_id` or `dataset_id`. 409 while the file is still being read; retry once it is.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftFillResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.fill",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.get",
        "command_path": "connector draft get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A per-parent table's `each` block says how its preview was sampled. `each.summary` reads like \"sampled 20 of 76 parents; 17 read, 3 failed\", or \"capped at 20 parents, total unknown\" when the parent table's row count is not known. `each.total` is the sample size, not the parent count (`each.parents_total` is).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetConnectorDraft",
        "pagination_policy": "none",
        "preconditions": "A per-parent table's `each` block says how its preview was sampled. `each.summary` reads like \"sampled 20 of 76 parents; 17 read, 3 failed\", or \"capped at 20 parents, total unknown\" when the parent table's row count is not known. `each.total` is the sample size, not the parent count (`each.parents_total` is).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.known-sources",
        "command_path": "connector draft known-sources",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Sources with no built-in connector that a draft can still start on, deep ones first.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftKnownSourcesResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/known-sources",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectorKnownSources",
        "pagination_policy": "none",
        "preconditions": "Read-only. Sources with no built-in connector that a draft can still start on, deep ones first.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftKnownSourcesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.known_sources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.list",
        "command_path": "connector draft list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. `status`: live (not saved yet, the default), saved or all.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectorDrafts",
        "pagination_policy": "none",
        "preconditions": "Read-only. `status`: live (not saved yet, the default), saved or all.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.open",
        "command_path": "connector draft open",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Take `ref` and `name` from a `connector draft browse` entry; each tab becomes a table of the draft.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftOpenResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/open",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "OpenConnectorDraftEntry",
        "pagination_policy": "none",
        "preconditions": "Take `ref` and `name` from a `connector draft browse` entry; each tab becomes a table of the draft.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftOpenResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.open",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.read-tables",
        "command_path": "connector draft read-tables",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Queues the reads and returns how many; each table shows as not read yet until its answer lands on the draft.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftReadTablesResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/read-tables",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ReadConnectorDraftTables",
        "pagination_policy": "none",
        "preconditions": "Queues the reads and returns how many; each table shows as not read yet until its answer lands on the draft.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftReadTablesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.read_tables",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.sample",
        "command_path": "connector draft sample",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A CSV, TSV or Excel file of about 5 MB at most; the server reads its header and first rows and does not keep it. Sets the draft's target columns.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftSampleResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sample",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ShapeConnectorDraftFromSample",
        "pagination_policy": "none",
        "preconditions": "A CSV, TSV or Excel file of about 5 MB at most; the server reads its header and first rows and does not keep it. Sets the draft's target columns.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSampleResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.sample",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "connector.draft.save",
        "command_path": "connector draft save",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Makes one dataset per source and joins the others onto the main one; `refresh: daily` refreshes each API or table source daily. The draft's `result` is set when the job is done.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftSaveResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/save",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "StartConnectorDraftSave",
        "pagination_policy": "none",
        "preconditions": "Makes one dataset per source and joins the others onto the main one; `refresh: daily` refreshes each API or table source daily. The draft's `result` is set when the job is done.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSaveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.save",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.source.join-candidates",
        "command_path": "connector draft source join-candidates",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Match counts are an estimate over the rows read so far.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftSourceJoinCandidatesResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources/{source_id}/join-candidates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectorDraftJoinCandidates",
        "pagination_policy": "none",
        "preconditions": "Read-only. Match counts are an estimate over the rows read so far.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftSourceJoinCandidatesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.join_candidates",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.draft.source.list",
        "command_path": "connector draft source list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A per-parent table's `each.summary` says how many parents its preview sampled, out of how many when that is known (`each.parents_total`).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDraftSourceListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectorDraftSources",
        "pagination_policy": "none",
        "preconditions": "A per-parent table's `each.summary` says how many parents its preview sampled, out of how many when that is known (`each.parents_total`).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftSourceListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.sources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.source.preview",
        "command_path": "connector draft source preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reads up to `limit` (1-100) rows through the connection and records what came back on the source. The limit is sent as given, but the server can return fewer rows; when the rows come back short of `limit` and the source holds more, the answer sets `capped` true with `limit_requested`, `limit_applied` and `source_row_count`. A preview is a sample; save the draft to read every row.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftSourcePreviewResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources/{source_id}/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PreviewConnectorDraftSource",
        "pagination_policy": "none",
        "preconditions": "Reads up to `limit` (1-100) rows through the connection and records what came back on the source. The limit is sent as given, but the server can return fewer rows; when the rows come back short of `limit` and the source holds more, the answer sets `capped` true with `limit_requested`, `limit_applied` and `source_row_count`. A preview is a sample; save the draft to read every row.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSourcePreviewResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.preview_source",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.draft.update",
        "command_path": "connector draft update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "`target_columns` replaces the list whole. `echo` adds a quiet note to the draft's thread for the agent's next turn.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDraftUpdateResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PatchConnectorDraft",
        "pagination_policy": "none",
        "preconditions": "`target_columns` replaces the list whole. `echo` adds a quiet note to the draft's thread for the agent's next turn.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "connector.ds-config.create",
        "command_path": "connector ds-config create",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs exactly one source; validate and data_sample cannot be combined.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDsConfigCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "ValidateAndGetDsConfig",
        "pagination_policy": "none",
        "preconditions": "Needs exactly one source; validate and data_sample cannot be combined.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.create_ds_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.ds-config.delete",
        "command_path": "connector ds-config delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Resolve immutable key before confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDsConfigDeleteResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDsConfig",
        "pagination_policy": "none",
        "preconditions": "Resolve immutable key before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.delete_ds_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "connector.ds-config.delete-all",
        "command_path": "connector ds-config delete-all",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDsConfigDeleteAllResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDsConfigs",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigDeleteAllResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.ds_config_delete_all",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.ds-config.get",
        "command_path": "connector ds-config get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reads one data-source config by key (from `connector ds-config list`); secrets in it are redacted.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDsConfigGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDsConfig",
        "pagination_policy": "none",
        "preconditions": "Reads one data-source config by key (from `connector ds-config list`); secrets in it are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDsConfigGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get_ds_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.ds-config.list",
        "command_path": "connector ds-config list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Secrets in nested configuration are redacted.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorDsConfigListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListDsConfigs",
        "pagination_policy": "single_page",
        "preconditions": "Secrets in nested configuration are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDsConfigListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_ds_configs",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "connector.ds-config.update",
        "command_path": "connector ds-config update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only the query path is supported by the server today; other paths are refused. Read the config first with `connector ds-config get`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ConnectorDsConfigUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "UpdateDsConfigs",
        "pagination_policy": "none",
        "preconditions": "Only the query path is supported by the server today; other paths are refused. Read the config first with `connector ds-config get`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.update_ds_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.get",
        "command_path": "connector get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_KEY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/connectors/{connector_key}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetConnector",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.list",
        "command_path": "connector list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/connectors",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceConnectors",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "connector.query.generate",
        "command_path": "connector query generate",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Keys are nonempty and cannot contain '/'.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorQueryGenerateResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetQuerySuggestion",
        "pagination_policy": "none",
        "preconditions": "Keys are nonempty and cannot contain '/'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorQueryGenerateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.ai.AIAPI.query_gen",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "connector.query.status",
        "command_path": "connector query status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ConnectorQueryStatusResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetChatStatus",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorQueryStatusResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.ai.AIAPI.status",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "context": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "context.project.clear",
        "command_path": "context project clear",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ContextProjectClearResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ContextProjectClearResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "context.project.status",
        "command_path": "context project status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ContextProjectStatusResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ContextProjectStatusResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "context.project.use",
        "command_path": "context project use",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROJECT_ID.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ContextProjectUseResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROJECT_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ContextProjectUseResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "context.show",
        "command_path": "context show",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Local read, no network call. Shows which profile, endpoint, workspace and project the next command would use; it never prints credentials.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ContextShowResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Local read, no network call. Shows which profile, endpoint, workspace and project the next command would use; it never prints credentials.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ContextShowResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "dashboard": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "returns_job",
        "canonical_command": "dashboard.action",
        "command_path": "dashboard action",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "B13 DASHBOARD_ASYNC_UNTYPED; publish/unpublish/delete-source require exact target confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardActionResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /dashboards/{dashboard_id}/action",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "DashboardAction",
        "pagination_policy": "none",
        "preconditions": "B13 DASHBOARD_ASYNC_UNTYPED; publish/unpublish/delete-source require exact target confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardActionResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.action",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.analytics",
        "command_path": "dashboard analytics",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardAnalyticsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/analytics",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardAnalytics",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAnalyticsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_analytics",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.archive",
        "command_path": "dashboard archive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardArchiveResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/{dashboard_id}/archive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ArchiveDashboard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardArchiveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.archive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.assess-pbix",
        "command_path": "dashboard assess-pbix",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "PbixAssessResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/pbix/assess",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AssessPbix",
        "pagination_policy": "none",
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "PbixAssessResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.assess_pbix",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.assess-twb",
        "command_path": "dashboard assess-twb",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "TwbAssessResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/twb/assess",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AssessTwb",
        "pagination_policy": "none",
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TwbAssessResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.assess_twb",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.attachment-create",
        "command_path": "dashboard attachment-create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Uploads a local workbook as a chat attachment. The attachment id it returns feeds dashboard pbix-intent and dashboard pbix-assess. Inside the Mammoth app the user's file cannot reach the agent, so send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardAttachmentCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/attachments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateAttachment",
        "pagination_policy": "none",
        "preconditions": "Uploads a local workbook as a chat attachment. The attachment id it returns feeds dashboard pbix-intent and dashboard pbix-assess. Inside the Mammoth app the user's file cannot reach the agent, so send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardAttachmentCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.audience.digest.get",
        "command_path": "dashboard audience digest get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Your weekly audience email setting for the board: enabled is the effective answer, explicit the stored choice (null when you never chose; the email then turns on by itself above 5 people a week for the creator and directly-granted editors). Editors only.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardAudienceDigestGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/audience/digest",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAudienceDigest",
        "pagination_policy": "none",
        "preconditions": "Your weekly audience email setting for the board: enabled is the effective answer, explicit the stored choice (null when you never chose; the email then turns on by itself above 5 people a week for the creator and directly-granted editors). Editors only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceDigestGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_digest_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.audience.digest.set",
        "command_path": "dashboard audience digest set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes your own weekly audience email setting for the board, nobody else's. Pass enabled in --input: true, false, or null to clear the choice and return to the default. Editors only.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardAudienceDigestSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/audience/digest",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetAudienceDigest",
        "pagination_policy": "none",
        "preconditions": "Writes your own weekly audience email setting for the board, nobody else's. Pass enabled in --input: true, false, or null to clear the choice and return to the default. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardAudienceDigestSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_digest_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.audience.get",
        "command_path": "dashboard audience get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Who read the board over the last days (7, 30 or 90; default 7): totals against the window before, a daily series, named workspace viewers, anonymous counts, country, device and viewport coverage, people it was shared with who never opened it, page and tile reach, and outward actions. Editors only. Never returns an IP or a city; editors' own visits are not counted.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardAudienceGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/audience",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardAudience",
        "pagination_policy": "none",
        "preconditions": "Who read the board over the last days (7, 30 or 90; default 7): totals against the window before, a daily series, named workspace viewers, anonymous counts, country, device and viewport coverage, people it was shared with who never opened it, page and tile reach, and outward actions. Editors only. Never returns an IP or a city; editors' own visits are not counted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.audience.summary",
        "command_path": "dashboard audience summary",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Views per board for the dashboard library: pass dashboard_ids in --input (200 are read at most). Per board: views and people over 7 days, views over 30 days, the last view and a 14-day daily series. A board never viewed is absent from items; boards outside the workspace or that you cannot edit are ignored.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardAudienceSummaryResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/dashboards/audience-summary",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AudienceSummary",
        "pagination_policy": "none",
        "preconditions": "Views per board for the dashboard library: pass dashboard_ids in --input (200 are read at most). Per board: views and people over 7 days, views over 30 days, the last view and a 14-day daily series. A board never viewed is absent from items; boards outside the workspace or that you cannot edit are ignored.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceSummaryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_summary",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.bi-export",
        "command_path": "dashboard bi-export",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Author-only, like bi-preflight. Terminal mode writes `output_path` to local disk. Inside the Mammoth app the download cannot reach the user: run `dashboard bi-preflight` to tell them what will convert, then send them to the dashboard's Publish menu (the arrow next to Publish) -> Export to Power BI / Export to Tableau, where they download the file themselves. No command makes a PDF of a board: that is the board's Download PDF in the app.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardBiExportResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/tableau/export",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "TableauExport",
        "pagination_policy": "none",
        "preconditions": "Author-only, like bi-preflight. Terminal mode writes `output_path` to local disk. Inside the Mammoth app the download cannot reach the user: run `dashboard bi-preflight` to tell them what will convert, then send them to the dashboard's Publish menu (the arrow next to Publish) -> Export to Power BI / Export to Tableau, where they download the file themselves. No command makes a PDF of a board: that is the board's Download PDF in the app.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardBiExportResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.export_powerbi",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.bi-preflight",
        "command_path": "dashboard bi-preflight",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Author-only, like the release routes it calls -- a non-author caller is refused, unlike `dashboard pdf export` (which any viewer can run).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "PowerBiPreflightResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/tableau",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "TableauPreflightHandler",
        "pagination_policy": "none",
        "preconditions": "Author-only, like the release routes it calls -- a non-author caller is refused, unlike `dashboard pdf export` (which any viewer can run).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "PowerBiPreflightResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.powerbi_preflight",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.cancel-generation",
        "command_path": "dashboard cancel-generation",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardCancelGenerationResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/cancel-generation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CancelDashboardGeneration",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCancelGenerationResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.cancel_generation",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.canvas.get",
        "command_path": "dashboard canvas get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A board's data is the view in the canvas dataset.dataview_id: read it with view data get VIEW_ID. After a board's bake job, read the canvas and quote one number from it, such as a KPI total.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardCanvasGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/canvas",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCanvasDraft",
        "pagination_policy": "none",
        "preconditions": "A board's data is the view in the canvas dataset.dataview_id: read it with view data get VIEW_ID. After a board's bake job, read the canvas and quote one number from it, such as a KPI total.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardCanvasGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.canvas.restore",
        "command_path": "dashboard canvas restore",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "target_sequence must be an existing draft version -- get the list from dashboard chat history DASHBOARD_ID, whose revisions[] gives {sequence, updated_at, updated_by_name} for every saved version, oldest first; pick the sequence to undo/redo/revert to.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardCanvasRestoreResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/canvas/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RestoreCanvas",
        "pagination_policy": "none",
        "preconditions": "target_sequence must be an existing draft version -- get the list from dashboard chat history DASHBOARD_ID, whose revisions[] gives {sequence, updated_at, updated_by_name} for every saved version, oldest first; pick the sequence to undo/redo/revert to.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCanvasRestoreResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.canvas.save",
        "command_path": "dashboard canvas save",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read the canvas with dashboard canvas get, edit, write back; a canvas with pages[] bakes the ACTIVE page (pages[i].focus / pages[i].added), a root-level focus is stored but produces no descriptors. focus.kpis entries are {field, agg, label, unit, decimals, filters}; agg countDistinct persists and bakes (ILG simulation 2026-09-19). added[].measure is a column name; a ratio goes in canvas.derived[] as {id, numerator, denominator} and is referenced by id from measure or a KPI field. Validation errors return the pydantic path (e.g. pages.0.added.2.measure). The response carries bake_job_id: job wait it, then dashboard canvas get for meta.figures (figure key -> descriptor id) and dashboard descriptor-data to evaluate. This raw route does not pass the LLM unit guard that pages add / chat edit apply.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardCanvasSaveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/canvas",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SaveCanvas",
        "pagination_policy": "none",
        "preconditions": "Read the canvas with dashboard canvas get, edit, write back; a canvas with pages[] bakes the ACTIVE page (pages[i].focus / pages[i].added), a root-level focus is stored but produces no descriptors. focus.kpis entries are {field, agg, label, unit, decimals, filters}; agg countDistinct persists and bakes (ILG simulation 2026-09-19). added[].measure is a column name; a ratio goes in canvas.derived[] as {id, numerator, denominator} and is referenced by id from measure or a KPI field. Validation errors return the pydantic path (e.g. pages.0.added.2.measure). The response carries bake_job_id: job wait it, then dashboard canvas get for meta.figures (figure key -> descriptor id) and dashboard descriptor-data to evaluate. This raw route does not pass the LLM unit guard that pages add / chat edit apply.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCanvasSaveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_save",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.chart-type.create",
        "command_path": "dashboard chart-type create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Workspace owners, admins and members. 400 with the reason when the name, needs, recipe or binding template break a rule, or the workspace already keeps 200 chart types.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardChartTypeCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/chart-types",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateWorkspaceChartType",
        "pagination_policy": "none",
        "preconditions": "Workspace owners, admins and members. 400 with the reason when the name, needs, recipe or binding template break a rule, or the workspace already keeps 200 chart types.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChartTypeCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.chart-type.delete",
        "command_path": "dashboard chart-type delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Workspace owners, admins and members; 404 for a chart type of another workspace.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardChartTypeDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/chart-types/{chart_type_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteWorkspaceChartType",
        "pagination_policy": "none",
        "preconditions": "Workspace owners, admins and members; 404 for a chart type of another workspace.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChartTypeDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.chart-type.list",
        "command_path": "dashboard chart-type list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Anyone in the workspace.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardChartTypeListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/chart-types",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceChartTypes",
        "pagination_policy": "none",
        "preconditions": "Anyone in the workspace.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardChartTypeListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.chat.attachment.upload",
        "command_path": "dashboard chat attachment upload",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, FILE.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardChatAttachmentUploadResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/chat/attachments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UploadChatAttachment",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, FILE.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChatAttachmentUploadResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_attachment_upload",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.chat.edit",
        "command_path": "dashboard chat edit",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes an existing board from one sentence (add, remove or change a chart, KPI or page): {\"body\": {\"params\": {\"prompt\": \"<the change>\"}}}; returns changed, a one-line message, the rebaked canvas, dashboard_link and values (the evaluated number of each KPI card and tile after the edit). Use it for a change you can say in a sentence; use dashboard canvas save to author the canvas yourself (units, hiding built-in tiles).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardChatEditResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ChatEdit",
        "pagination_policy": "none",
        "preconditions": "Changes an existing board from one sentence (add, remove or change a chart, KPI or page): {\"body\": {\"params\": {\"prompt\": \"<the change>\"}}}; returns changed, a one-line message, the rebaked canvas, dashboard_link and values (the evaluated number of each KPI card and tile after the edit). Use it for a change you can say in a sentence; use dashboard canvas save to author the canvas yourself (units, hiding built-in tiles).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChatEditResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_edit",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.chat.history",
        "command_path": "dashboard chat history",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The response carries a revisions[] list (one {sequence, updated_at, updated_by_name} per saved version, oldest first) -- real on the wire but not yet in the typed SDK model, so read it from --output json. It is the version list for dashboard canvas restore's target_sequence: to undo/revert the board, find the sequence to go back to here and pass it there.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardChatHistoryResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/chat",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3ChatHistory",
        "pagination_policy": "none",
        "preconditions": "The response carries a revisions[] list (one {sequence, updated_at, updated_by_name} per saved version, oldest first) -- real on the wire but not yet in the typed SDK model, so read it from --output json. It is the version list for dashboard canvas restore's target_sequence: to undo/revert the board, find the sequence to go back to here and pass it there.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardChatHistoryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_history",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.columns",
        "command_path": "dashboard columns",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Every column of the board's source dataset with its profile: value samples, measure ranges and aggregates, date spans, and the profiler's identifier and protected-attribute verdicts, plus on_board_count, row_count and signals. Served from the cached dataset profile.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardColumnsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/columns",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetColumnRoster",
        "pagination_policy": "none",
        "preconditions": "Every column of the board's source dataset with its profile: value samples, measure ranges and aggregates, date spans, and the profiler's identifier and protected-attribute verdicts, plus on_board_count, row_count and signals. Served from the cached dataset profile.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardColumnsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.column_roster",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.context.apply",
        "command_path": "dashboard context apply",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes the candidate a dashboard context review proposed, as a new canvas version that undo and the version timeline reach. The change is the server's own reviewed plan, never canvas content from the caller. Pass the review_id from dashboard context review (second positional). Optional keep (roster keys whose hand-typed text to keep) and base_sequence (the head the review was computed against). The server rejects an expired or superseded review, and a board whose head moved since the review.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardContextApplyResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/context-review/{review_id}/apply",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ApplyContextReview",
        "pagination_policy": "none",
        "preconditions": "Writes the candidate a dashboard context review proposed, as a new canvas version that undo and the version timeline reach. The change is the server's own reviewed plan, never canvas content from the caller. Pass the review_id from dashboard context review (second positional). Optional keep (roster keys whose hand-typed text to keep) and base_sequence (the head the review was computed against). The server rejects an expired or superseded review, and a board whose head moved since the review.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextApplyResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_apply",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.context.create",
        "command_path": "dashboard context create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardContextCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/contexts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateContext",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.context.delete",
        "command_path": "dashboard context delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONTEXT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardContextDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/contexts/{context_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteContext",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONTEXT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.context.extract",
        "command_path": "dashboard context extract",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ContextExtractResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/contexts/extract",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExtractContext",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ContextExtractResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.extract_context",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.context.list",
        "command_path": "dashboard context list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardContextListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/contexts",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListContexts",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardContextListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.context.review",
        "command_path": "dashboard context review",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Dry run of a context edit: what applying the board's current context would change. Nothing is written (not the canvas, the transcript or the bake). Waits for the job; its result holds the item-level change set and a review_id, which is null when the context changes nothing. Optional scope (summary, insights or all), note (1000 characters at most) and fresh (work it out again). Pass review_id to dashboard context apply.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardContextReviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/context-review",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ReviewContext",
        "pagination_policy": "none",
        "preconditions": "Dry run of a context edit: what applying the board's current context would change. Nothing is written (not the canvas, the transcript or the bake). Waits for the job; its result holds the item-level change set and a review_id, which is null when the context changes nothing. Optional scope (summary, insights or all), note (1000 characters at most) and fresh (work it out again). Pass review_id to dashboard context apply.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardContextReviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_review",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.context.update",
        "command_path": "dashboard context update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONTEXT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardContextUpdateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/v3/contexts/{context_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateContext",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONTEXT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.create-blank",
        "command_path": "dashboard create-blank",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "To build a board from a description, use dashboard v3 generate instead. Input is {\"params\": {\"dataview_id\": VIEW_ID, \"title\": ...}} with --yes; returns {id, sequence}. The blank canvas has one page (p1) and no figures: author it with dashboard chat edit, or by hand with dashboard canvas get -> edit -> dashboard canvas save or dashboard pages add. One dataview per dashboard.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardCreateBlankResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/blank",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateBlankDashboard",
        "pagination_policy": "none",
        "preconditions": "To build a board from a description, use dashboard v3 generate instead. Input is {\"params\": {\"dataview_id\": VIEW_ID, \"title\": ...}} with --yes; returns {id, sequence}. The blank canvas has one page (p1) and no figures: author it with dashboard chat edit, or by hand with dashboard canvas get -> edit -> dashboard canvas save or dashboard pages add. One dataview per dashboard.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCreateBlankResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.create_blank",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.data.draft",
        "command_path": "dashboard data draft",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardDataDraftResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/getDraftData",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDraftDataFromSql",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardDataDraftResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_draft_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.data.published",
        "command_path": "dashboard data published",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardDataPublishedResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/getPublishData",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPublishDataFromSql",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardDataPublishedResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_publish_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.delete",
        "command_path": "dashboard delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable dashboard-ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDashboard",
        "pagination_policy": "none",
        "preconditions": "Immutable dashboard-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.descriptor-data",
        "command_path": "dashboard descriptor-data",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Evaluates baked descriptors by id. Ids come from dashboard canvas get data.meta.figures[<page>:<kpi|add>:<n>].descriptors.value (rows for a table figure) and data.meta.filters. body.params.filter_state is {\"<filter field>\": value} against the canvas's declared filters: a range control takes [start, end] (dates as YYYY-MM-DD), categorical controls a list of values; an undeclared field is rejected. Results are {descriptor_id: {status, value | data}}. Used to prove a countDistinct card under a Month range (ILG simulation 2026-09-19).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardDescriptorDataResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DescriptorData",
        "pagination_policy": "none",
        "preconditions": "Evaluates baked descriptors by id. Ids come from dashboard canvas get data.meta.figures[<page>:<kpi|add>:<n>].descriptors.value (rows for a table figure) and data.meta.filters. body.params.filter_state is {\"<filter field>\": value} against the canvas's declared filters: a range control takes [start, end] (dates as YYYY-MM-DD), categorical controls a list of values; an undeclared field is rejected. Results are {descriptor_id: {status, value | data}}. Used to prove a countDistinct card under a Month range (ILG simulation 2026-09-19).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDescriptorDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.descriptor_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "start_or_wait",
        "canonical_command": "dashboard.duplicate",
        "command_path": "dashboard duplicate",
        "confirmation": "none",
        "contract": {
          "async": "start_or_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Copies the dashboard over the same dataset. Example: mammoth dashboard duplicate 123 --input '{\"target_dataview_id\": 456}'. With the target_dataview_id input field the copy is made in that view's project and its data swap is queued: the command waits for that job and adds swap_state and swap_result next to id and swap_job_id. project_id (optional) names the project for the copy.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardDuplicateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/{dashboard_id}/duplicate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DuplicateDashboard",
        "pagination_policy": "none",
        "preconditions": "Copies the dashboard over the same dataset. Example: mammoth dashboard duplicate 123 --input '{\"target_dataview_id\": 456}'. With the target_dataview_id input field the copy is made in that view's project and its data swap is queued: the command waits for that job and adds swap_state and swap_result next to id and swap_job_id. project_id (optional) names the project for the copy.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDuplicateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.duplicate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "start_or_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.get",
        "command_path": "dashboard email-updates get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmailUpdatesGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/email-updates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.list",
        "command_path": "dashboard email-updates list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmailUpdatesListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/email-updates",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceEmailUpdates",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.me.get",
        "command_path": "dashboard email-updates me get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmailUpdatesMeGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/email-updates/me",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetMyDashboardEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesMeGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_me_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.me.set",
        "command_path": "dashboard email-updates me set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Turns your own email updates for the dashboard on or off; nobody else's.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmailUpdatesMeSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/email-updates/me",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetMyDashboardEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Turns your own email updates for the dashboard on or off; nobody else's.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesMeSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_me_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.set",
        "command_path": "dashboard email-updates set",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Saves the email-update schedule and the people who get the dashboard's headline numbers by mail. Needs --yes. Editors only.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmailUpdatesSetResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PUT /dashboards/{dashboard_id}/email-updates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "SaveDashboardEmailUpdates",
        "pagination_policy": "none",
        "preconditions": "Saves the email-update schedule and the people who get the dashboard's headline numbers by mail. Needs --yes. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.email-updates.test",
        "command_path": "dashboard email-updates test",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sends a real test email update right away. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmailUpdatesTestResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /dashboards/{dashboard_id}/email-updates/test",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "TestDashboardEmailUpdate",
        "pagination_policy": "none",
        "preconditions": "Sends a real test email update right away. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesTestResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_test",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.embed.config.get",
        "command_path": "dashboard embed config get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmbedConfigGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/embed/config",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetEmbedConfig",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedConfigGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_config_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.embed.config.set",
        "command_path": "dashboard embed config set",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedConfigSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /dashboards/{dashboard_id}/embed/config",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "PutEmbedConfig",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedConfigSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_config_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.embed.key.rotate",
        "command_path": "dashboard embed key rotate",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedKeyRotateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/{dashboard_id}/embed/key",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RotateEmbedKey",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedKeyRotateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_key_rotate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.embed.lifetime.set",
        "command_path": "dashboard embed lifetime set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedLifetimeSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /workspaces/{workspace_id}/embed/lifetime",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetEmbedLifetime",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedLifetimeSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_lifetime_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.embed.origin.revoke",
        "command_path": "dashboard embed origin revoke",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedOriginRevokeResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /dashboards/{dashboard_id}/embed/origin",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RevokeOrigin",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedOriginRevokeResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_origin_revoke",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.embed.preview-token.create",
        "command_path": "dashboard embed preview-token create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedPreviewTokenCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/embed/preview-token",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PreviewToken",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedPreviewTokenCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_preview_token_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.embed.secret.rotate",
        "command_path": "dashboard embed secret rotate",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEmbedSecretRotateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/embed/secret",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RotateEmbedSecret",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedSecretRotateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_secret_rotate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.embed.usage.get",
        "command_path": "dashboard embed usage get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmbedUsageGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/embed/usage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetEmbedUsage",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedUsageGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_usage_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.embed.usage.summary",
        "command_path": "dashboard embed usage summary",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Active embed origins per board over the last 90 days, for several boards in one call (the library view). Boards outside the workspace are ignored. For one board's origins and render counts use dashboard embed usage get.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEmbedUsageSummaryResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/dashboards/embed-usage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "EmbedUsageSummary",
        "pagination_policy": "none",
        "preconditions": "Active embed origins per board over the last 90 days, for several boards in one call (the library view). Boards outside the workspace are ignored. For one board's origins and render counts use dashboard embed usage get.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedUsageSummaryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_usage_summary",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.engagement.get",
        "command_path": "dashboard engagement get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Editors only. Reach against the people the board is shared with, depth per page and per person, hours (UTC), surface, devices, actions and board events. days is 7, 30 or 90 (default 30); viewers is all, named or anonymous.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEngagementGetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/engagement",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardEngagement",
        "pagination_policy": "none",
        "preconditions": "Read-only. Editors only. Reach against the people the board is shared with, depth per page and per person, hours (UTC), surface, devices, actions and board events. days is 7, 30 or 90 (default 30); viewers is all, named or anonymous.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEngagementGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.engagement.person",
        "command_path": "dashboard engagement person",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. One person's visits to the board, newest first, at most 50. Take USER_ID from the people list of dashboard engagement get. days is 7, 30 or 90 (default 30).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardEngagementPersonResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/engagement/people/{user_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardEngagementPerson",
        "pagination_policy": "none",
        "preconditions": "Read-only. One person's visits to the board, newest first, at most 50. Take USER_ID from the people list of dashboard engagement get. days is 7, 30 or 90 (default 30).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEngagementPersonResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement_person",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.engagement.remind",
        "command_path": "dashboard engagement remind",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Emails the share link again to people who have not opened the board. user_ids takes 1 to 200 people from dashboard engagement get (people with can_remind true). The server sends one reminder per person per board every 7 days; skipped lists who was left out and why. Always needs --yes; --dry-run sends nothing.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardEngagementRemindResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /dashboards/{dashboard_id}/engagement/remind",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "PostDashboardEngagementRemind",
        "pagination_policy": "none",
        "preconditions": "Emails the share link again to people who have not opened the board. user_ids takes 1 to 200 people from dashboard engagement get (people with can_remind true). The server sends one reminder per person per board every 7 days; skipped lists who was left out and why. Always needs --yes; --dry-run sends nothing.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEngagementRemindResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement_remind",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.exemplar.extract",
        "command_path": "dashboard exemplar extract",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ExemplarExtractResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/exemplar/extract",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExtractExemplar",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExemplarExtractResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.extract_exemplar",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.figure.add",
        "command_path": "dashboard figure add",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds one figure (an explore card) with no chat turn. Pass {\"intent\": \"...\"} (optional kind) and the server picks and draws the chart, as dashboard figure-intent does; or pass an exact figure. With a figure, dataview_id must be the dashboard's own view. figure is the figure as the canvas stores it, without its id: kind plus its bindings (measure, dim, agg, title). Optional banded (a banded dimension without its id; figure.dim then points at it) and page: {\"id\": PAGE_ID} for an existing content page or {\"new_title\": \"...\"} for a new one; with neither the figure lands on the first content page. The server checks the figure against the dashboard's source and queues the bake: the result carries bake_job_id; wait for it with job wait.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardFigureAddResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/figures",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AppendFigure",
        "pagination_policy": "none",
        "preconditions": "Adds one figure (an explore card) with no chat turn. Pass {\"intent\": \"...\"} (optional kind) and the server picks and draws the chart, as dashboard figure-intent does; or pass an exact figure. With a figure, dataview_id must be the dashboard's own view. figure is the figure as the canvas stores it, without its id: kind plus its bindings (measure, dim, agg, title). Optional banded (a banded dimension without its id; figure.dim then points at it) and page: {\"id\": PAGE_ID} for an existing content page or {\"new_title\": \"...\"} for a new one; with neither the figure lands on the first content page. The server checks the figure against the dashboard's source and queues the bake: the result carries bake_job_id; wait for it with job wait.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardFigureAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.append_figure",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.figure.drill",
        "command_path": "dashboard figure drill",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Editors of the draft board. `figure` is the figure's PAGE:SLOT:ID key (the keys of `meta.figures` in `dashboard canvas get`); `path` holds 1-4 marks from the top level, each `{\"key\": VALUE}`. Waits for the job and returns the handle with its results; a figure with no level below answers 400 drill_no_level.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardFigureDrillResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/drill",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FigureDrill",
        "pagination_policy": "none",
        "preconditions": "Editors of the draft board. `figure` is the figure's PAGE:SLOT:ID key (the keys of `meta.figures` in `dashboard canvas get`); `path` holds 1-4 marks from the top level, each `{\"key\": VALUE}`. Waits for the job and returns the handle with its results; a figure with no level below answers 400 drill_no_level.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureDrillResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_drill",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.figure.recipe",
        "command_path": "dashboard figure recipe",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only: nothing is saved. Add the returned `added` spec with `dashboard figure add`. A projection is refused: a drawing cannot show a number that is not in the data.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardFigureRecipeResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/figure-recipe",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FigureRecipe",
        "pagination_policy": "none",
        "preconditions": "Read-only: nothing is saved. Add the returned `added` spec with `dashboard figure add`. A projection is refused: a drawing cannot show a number that is not in the data.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureRecipeResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_recipe",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.figure.rows",
        "command_path": "dashboard figure rows",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Editors with access to the figure's dataview; works before the figure's reader setting is on. `figure` is the PAGE:SLOT:ID key and `key` the mark's value. Waits for the job and returns the handle (which descriptor is the rows, the count and the total) with the results: up to 500 rows.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardFigureRowsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/{dashboard_id}/rows",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FigureRows",
        "pagination_policy": "none",
        "preconditions": "Editors with access to the figure's dataview; works before the figure's reader setting is on. `figure` is the PAGE:SLOT:ID key and `key` the mark's value. Waits for the job and returns the handle (which descriptor is the rows, the count and the total) with the results: up to 500 rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureRowsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_rows",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.figure-intent",
        "command_path": "dashboard figure-intent",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardFigureIntentResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/figure-intent",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "FigureIntent",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardFigureIntentResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_intent",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dashboard.filter.add",
        "command_path": "dashboard filter add",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Adds a filter control on one column to ONE board so the viewer picks the value (Region, Month, Status). Use this for any \"per <column>\" or \"by <column>\" ask instead of building a board per value. --input: \"field\" (a column of the board's data, required), optional \"control\" (multi, dropdown, chips, search for a category; range for a number or date; the backend rejects a control the column type does not take), \"label\", \"default\" (list of values selected at first). A second add on the same field replaces the first. Reads the draft canvas, edits filters[], saves it; returns the declared filters, sequence and bake_job_id (dashboard job wait). Example: --input '{\"field\": \"Region\", \"control\": \"dropdown\", \"label\": \"Region\"}'.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DashboardFilterResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Adds a filter control on one column to ONE board so the viewer picks the value (Region, Month, Status). Use this for any \"per <column>\" or \"by <column>\" ask instead of building a board per value. --input: \"field\" (a column of the board's data, required), optional \"control\" (multi, dropdown, chips, search for a category; range for a number or date; the backend rejects a control the column type does not take), \"label\", \"default\" (list of values selected at first). A second add on the same field replaces the first. Reads the draft canvas, edits filters[], saves it; returns the declared filters, sequence and bake_job_id (dashboard job wait). Example: --input '{\"field\": \"Region\", \"control\": \"dropdown\", \"label\": \"Region\"}'.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dashboard.filter.list",
        "command_path": "dashboard filter list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists the filter controls a board declares ({field, control, label, default}); read it before adding one.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardFilterResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Lists the filter controls a board declares ({field, control, label, default}); read it before adding one.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dashboard.filter.remove",
        "command_path": "dashboard filter remove",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes the filter control on one column from a board; fails and names the declared filters when the column has none. --input: {\"field\": COLUMN}. Returns the filters that remain, sequence and bake_job_id.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DashboardFilterResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Removes the filter control on one column from a board; fails and names the declared filters when the column has none. --input: {\"field\": COLUMN}. Returns the filters that remain, sequence and bake_job_id.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.format-preview",
        "command_path": "dashboard format-preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Dry run of a format switch on a copy of the canvas: what carries over, what the new style adds, and what the target cannot show (not_shown). Nothing is saved. Take style names from dashboard style preset list.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardFormatPreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/format-preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FormatPreview",
        "pagination_policy": "none",
        "preconditions": "Dry run of a format switch on a copy of the canvas: what carries over, what the new style adds, and what the target cannot show (not_shown). Nothing is saved. Take style names from dashboard style preset list.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFormatPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.format_preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.gallery.get",
        "command_path": "dashboard gallery get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "One card of the public template gallery. A user-saved template, or a curated one that is not live, answers 404 exactly as an unknown slug does.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardGalleryGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/public/templates/{slug}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardPublicTemplate",
        "pagination_policy": "none",
        "preconditions": "One card of the public template gallery. A user-saved template, or a curated one that is not live, answers 404 exactly as an unknown slug does.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGalleryGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.gallery_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.gallery.list",
        "command_path": "dashboard gallery list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "The public template gallery as data: curated, live templates only, with copy, taxonomy labels, thumbnail_ref and viewer_url, and the function/industry facets with counts. No internal ids. Optional function or industry narrow it; an unknown facet answers 404. To use one in this workspace, use dashboard template list and dashboard templates use.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardGalleryListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/public/templates",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardPublicTemplates",
        "pagination_policy": "single_page",
        "preconditions": "The public template gallery as data: curated, live templates only, with copy, taxonomy labels, thumbnail_ref and viewer_url, and the function/industry facets with counts. No internal ids. Optional function or industry narrow it; an unknown facet answers 404. To use one in this workspace, use dashboard template list and dashboard templates use.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGalleryListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.gallery_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.get",
        "command_path": "dashboard get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.get-by-url",
        "command_path": "dashboard get-by-url",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "URL is a slug, not an arbitrary request URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardGetByUrlResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardByUrl",
        "pagination_policy": "none",
        "preconditions": "URL is a slug, not an arbitrary request URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGetByUrlResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_by_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.import-workbook",
        "command_path": "dashboard import-workbook",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ImportDatasetResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/import/dataset",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ImportWorkbookDataset",
        "pagination_policy": "none",
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ImportDatasetResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.import_workbook",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.job-by-url",
        "command_path": "dashboard job-by-url",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL, JOB_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardJobByUrlResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/jobs/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardJob",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardJobByUrlResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.job_by_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.list",
        "command_path": "dashboard list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListDashboard",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.live-chart.audience",
        "command_path": "dashboard live-chart audience",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes who can open the live chart. Pass the new audience in --input. Confirms the dashboard id.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardLiveChartAudienceResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /dashboards/v3/live-charts/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ChangeAudience",
        "pagination_policy": "none",
        "preconditions": "Changes who can open the live chart. Pass the new audience in --input. Confirms the dashboard id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartAudienceResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_audience",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "start_or_wait",
        "canonical_command": "dashboard.live-chart.create",
        "command_path": "dashboard live-chart create",
        "confirmation": "none",
        "contract": {
          "async": "start_or_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Turns a chart made in an agent chat into a live chart on a dashboard of its own. Creates a dashboard, then waits for its bake job (bounded by --job-timeout) and reads the chart back; making the same chat chart live twice returns the first chart with no job. --project names the project the chart belongs to; without it the server uses the source view's project.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardLiveChartCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/live-charts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateLiveChart",
        "pagination_policy": "none",
        "preconditions": "Turns a chart made in an agent chat into a live chart on a dashboard of its own. Creates a dashboard, then waits for its bake job (bounded by --job-timeout) and reads the chart back; making the same chat chart live twice returns the first chart with no job. --project names the project the chart belongs to; without it the server uses the source view's project.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "start_or_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.live-chart.get",
        "command_path": "dashboard live-chart get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardLiveChartGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/live-charts/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetLiveChart",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.live-chart.list",
        "command_path": "dashboard live-chart list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardLiveChartListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/live-charts",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListLiveCharts",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.live-chart.placement",
        "command_path": "dashboard live-chart placement",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Records where a live chart is shown (an embed or a page).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardLiveChartPlacementResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/live-charts/{dashboard_id}/placements",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RecordPlacement",
        "pagination_policy": "none",
        "preconditions": "Records where a live chart is shown (an embed or a page).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartPlacementResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_placement",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.live-chart.usage",
        "command_path": "dashboard live-chart usage",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardLiveChartUsageResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/live-charts/{dashboard_id}/usage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUsage",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartUsageResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_usage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.oembed",
        "command_path": "dashboard oembed",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardOembedResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/oembed",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "Oembed",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOembedResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.oembed",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.og-card",
        "command_path": "dashboard og-card",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardOgCardResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/og-card",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "OgCard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOgCardResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.og_card",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.own-data.accept",
        "command_path": "dashboard own-data accept",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Applies the proposed version to the board, which changes it. choice is proposal (default), partial or reshape; exclude lists change ids of added items to leave out. Waits for the applying job.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardOwnDataAcceptResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/{dashboard_id}/own-data/accept",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AcceptOwnData",
        "pagination_policy": "none",
        "preconditions": "Applies the proposed version to the board, which changes it. choice is proposal (default), partial or reshape; exclude lists change ids of added items to leave out. Waits for the applying job.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataAcceptResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_accept",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.own-data.dismiss",
        "command_path": "dashboard own-data dismiss",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Drops the pending 'use my data' run. The board is not changed.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardOwnDataDismissResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/{dashboard_id}/own-data/dismiss",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DismissOwnData",
        "pagination_policy": "none",
        "preconditions": "Drops the pending 'use my data' run. The board is not changed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataDismissResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_dismiss",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.own-data.preview",
        "command_path": "dashboard own-data preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The adapted board as proposed, baked but not saved.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardOwnDataPreviewResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/{dashboard_id}/own-data/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "PreviewOwnData",
        "pagination_policy": "none",
        "preconditions": "Read-only. The adapted board as proposed, baked but not saved.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOwnDataPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.own-data.start",
        "command_path": "dashboard own-data start",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Fits a template board to your own data and waits for the proposal. Give exactly one of dataview_id, dataset_id or ingest_job_id. The board is not changed; read the proposal with dashboard own-data status and preview, then accept or dismiss. Replaces any pending run. Uses an AI call.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardOwnDataStartResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/{dashboard_id}/own-data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "StartOwnData",
        "pagination_policy": "none",
        "preconditions": "Fits a template board to your own data and waits for the proposal. Give exactly one of dataview_id, dataset_id or ingest_job_id. The board is not changed; read the proposal with dashboard own-data status and preview, then accept or dismiss. Replaces any pending run. Uses an AI call.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataStartResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_start",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.own-data.status",
        "command_path": "dashboard own-data status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The board's pending 'use my data' run: status and stage, and once fitted the proposal. status null means nothing is pending.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardOwnDataStatusResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/{dashboard_id}/own-data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetOwnData",
        "pagination_policy": "none",
        "preconditions": "Read-only. The board's pending 'use my data' run: status and stage, and once fitted the proposal. status null means nothing is pending.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOwnDataStatusResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_status",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.page.plan",
        "command_path": "dashboard page plan",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPagePlanResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/plan-page",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PlanPage",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPagePlanResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.page_plan",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "returns_job",
        "canonical_command": "dashboard.pages.add",
        "command_path": "dashboard pages add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "returns_job",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "To add or change content by description, use dashboard chat edit instead. Requires --yes --confirm DASHBOARD_ID. body.params.pages is a list of PageAdd objects: {title, focus: {measure, dim, kpis: [...]}, charts: [{kind, title, dim, measure, agg}]}; the schema example''s {} entry is not a usable page. The route runs through the LLM control guard: in the ILG simulation it dropped unit.prefix on a money card (\"nothing in this data says which currency\") that dashboard canvas save had kept, and reports that in data.message.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPagesAddResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/{dashboard_id}/pages",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddPages",
        "pagination_policy": "none",
        "preconditions": "To add or change content by description, use dashboard chat edit instead. Requires --yes --confirm DASHBOARD_ID. body.params.pages is a list of PageAdd objects: {title, focus: {measure, dim, kpis: [...]}, charts: [{kind, title, dim, measure, agg}]}; the schema example''s {} entry is not a usable page. The route runs through the LLM control guard: in the ILG simulation it dropped unit.prefix on a money card (\"nothing in this data says which currency\") that dashboard canvas save had kept, and reports that in data.message.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPagesAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.add_pages",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.pbix-assess",
        "command_path": "dashboard pbix-assess",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Assesses a workbook the web app already attached (ATTACHMENT_ID): waits for the job and returns its result. Use dashboard assess-pbix for a local file.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPbixAssessResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/attachments/{attachment_id}/assess",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AttachmentAssess",
        "pagination_policy": "none",
        "preconditions": "Read-only. Assesses a workbook the web app already attached (ATTACHMENT_ID): waits for the job and returns its result. Use dashboard assess-pbix for a local file.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPbixAssessResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_assess",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.pbix-intent",
        "command_path": "dashboard pbix-intent",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Reads a Power BI workbook the web app already attached (ATTACHMENT_ID) against one of your views (TARGET_DATAVIEW_ID), waits for the job and returns its result: intent, coverage {mapped, total}, unmapped_visuals, field_map and target_dataview_id, or {rejected, source}. No dashboard or sample data is made. Uploading the attachment is done in the web app.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPbixIntentResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/attachments/{attachment_id}/intent",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "AttachmentIntent",
        "pagination_policy": "none",
        "preconditions": "Read-only. Reads a Power BI workbook the web app already attached (ATTACHMENT_ID) against one of your views (TARGET_DATAVIEW_ID), waits for the job and returns its result: intent, coverage {mapped, total}, unmapped_visuals, field_map and target_dataview_id, or {rejected, source}. No dashboard or sample data is made. Uploading the attachment is done in the web app.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPbixIntentResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_intent",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.pdf.export",
        "command_path": "dashboard pdf export",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Backend requires params.data to be the browser-hydrated DashboardData map (pre-rendered widget results); the server stores only query descriptors and cannot rebuild it, so a PDF cannot be produced from the CLI alone; point the user to the board's Download PDF in the app.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPdfExportResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/pdf",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExportPdf",
        "pagination_policy": "none",
        "preconditions": "Backend requires params.data to be the browser-hydrated DashboardData map (pre-rendered widget results); the server stores only query descriptors and cannot rebuild it, so a PDF cannot be produced from the CLI alone; point the user to the board's Download PDF in the app.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPdfExportResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.pdf_export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.pdf-artifact",
        "command_path": "dashboard pdf-artifact",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, JOB_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPdfArtifactResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/pdf/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPdfArtifact",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPdfArtifactResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.pdf_artifact",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.published.canvas",
        "command_path": "dashboard published canvas",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedCanvasResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/canvas",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCanvasPublished",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedCanvasResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_canvas",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.published.data",
        "command_path": "dashboard published data",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPublishedDataResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/url/{url}/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DescriptorDataByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.published.drill",
        "command_path": "dashboard published drill",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Any viewer of the published board, under the viewer's row-level scope; 403 drill_disabled until the figure's reader setting lets readers drill. Same body as `dashboard figure drill`.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedDrillResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/url/{url}/drill",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FigureDrillByUrl",
        "pagination_policy": "none",
        "preconditions": "Any viewer of the published board, under the viewer's row-level scope; 403 drill_disabled until the figure's reader setting lets readers drill. Same body as `dashboard figure drill`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedDrillResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_drill",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.published.og-card",
        "command_path": "dashboard published og-card",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedOgCardResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/og-card",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "OgCardByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedOgCardResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_og_card",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.published.pdf.export",
        "command_path": "dashboard published pdf export",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPublishedPdfExportResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/url/{url}/pdf",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExportPdfByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedPdfExportResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_pdf_export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.published.pdf-artifact",
        "command_path": "dashboard published pdf-artifact",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL, JOB_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedPdfArtifactResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/pdf/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPdfArtifactByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedPdfArtifactResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_pdf_artifact",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dashboard.published.rows",
        "command_path": "dashboard published rows",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Signed-in readers only, under their row-level scope; 403 rows_disabled until the figure's reader setting is on, and refused on public links and signed embeds. Same body as `dashboard figure rows`.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedRowsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/url/{url}/rows",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FigureRowsByUrl",
        "pagination_policy": "none",
        "preconditions": "Signed-in readers only, under their row-level scope; 403 rows_disabled until the figure's reader setting is on, and refused on public links and signed embeds. Same body as `dashboard figure rows`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedRowsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_rows",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.published.share-page",
        "command_path": "dashboard published share-page",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedSharePageResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/share",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SharePageByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedSharePageResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_share_page",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.published.video.export",
        "command_path": "dashboard published video export",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPublishedVideoExportResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/url/{url}/video",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExportVideoByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedVideoExportResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_video_export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.published.video-artifact",
        "command_path": "dashboard published video-artifact",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardPublishedVideoArtifactResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/url/{url}/video.mp4",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "VideoByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedVideoArtifactResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_video_artifact",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.published-data-by-url",
        "command_path": "dashboard published-data-by-url",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardPublishedDataByUrlResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/url/{url}/getPublishData",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "GetPublishDataFromSqlByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedDataByUrlResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_data_by_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.qa.ask",
        "command_path": "dashboard qa ask",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaAskResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/ask",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "Ask",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaAskResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_ask",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.comment.create",
        "command_path": "dashboard qa comment create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaCommentCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/comments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3AddComment",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaCommentCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_comment_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.comment.delete",
        "command_path": "dashboard qa comment delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, COMMENT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaCommentDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/{dashboard_id}/qa/sessions/{session_id}/comments/{comment_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteComment",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, COMMENT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaCommentDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_comment_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.feedback",
        "command_path": "dashboard qa feedback",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, MESSAGE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaFeedbackResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/messages/{message_id}/feedback",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3QaFeedback",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, MESSAGE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaFeedbackResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_feedback",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.qa.insights",
        "command_path": "dashboard qa insights",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The questions viewers asked on the board over the last days (7, 30 or 90; default 7), grouped by their text, with feedback and unanswered counts and the measure and dimension each answer was about. Editors only. Nobody is named: no user, session or name is returned, and editors' own questions are left out.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardQaInsightsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/qa/insights",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3QaInsights",
        "pagination_policy": "none",
        "preconditions": "The questions viewers asked on the board over the last days (7, 30 or 90; default 7), grouped by their text, with feedback and unanswered counts and the measure and dimension each answer was about. Editors only. Nobody is named: no user, session or name is returned, and editors' own questions are left out.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaInsightsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_insights",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.create",
        "command_path": "dashboard qa session create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSessionCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/qa/sessions",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.delete",
        "command_path": "dashboard qa session delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSessionDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/{dashboard_id}/qa/sessions/{session_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DashboardV3DeleteSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.fork",
        "command_path": "dashboard qa session fork",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSessionForkResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/fork",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ForkSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionForkResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_fork",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.get",
        "command_path": "dashboard qa session get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardQaSessionGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/qa/sessions/{session_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSessionGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.list",
        "command_path": "dashboard qa session list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardQaSessionListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/qa/sessions",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3ListSessions",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSessionListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.rename",
        "command_path": "dashboard qa session rename",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSessionRenameResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/qa/sessions/{session_id}/title",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RenameSession",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionRenameResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_rename",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.session.set-visibility",
        "command_path": "dashboard qa session set-visibility",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSessionSetVisibilityResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/qa/sessions/{session_id}/visibility",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3SetVisibility",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionSetVisibilityResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_set_visibility",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.qa.settings.get",
        "command_path": "dashboard qa settings get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardQaSettingsGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/qa/settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3GetQaSettings",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSettingsGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_settings_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.qa.settings.set",
        "command_path": "dashboard qa settings set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQaSettingsSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/qa/settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3SetQaSettings",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSettingsSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_settings_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.query",
        "command_path": "dashboard query",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardQueryResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/query",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AdhocQuery",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQueryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.query",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.restore",
        "command_path": "dashboard restore",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardRestoreResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RestoreDashboard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardRestoreResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.rls.assignment.list",
        "command_path": "dashboard rls assignment list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardRlsAssignmentListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/rls/assignments",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListRlsAssignments",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsAssignmentListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_assignment_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.rls.assignment.set",
        "command_path": "dashboard rls assignment set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardRlsAssignmentSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/{dashboard_id}/rls/assignments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetRlsAssignments",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardRlsAssignmentSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_assignment_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.rls.column.list",
        "command_path": "dashboard rls column list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardRlsColumnListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/rls/columns",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetRlsColumns",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsColumnListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_column_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.rls.value.list",
        "command_path": "dashboard rls value list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardRlsValueListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/rls/values",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetRlsDistinctValues",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsValueListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_value_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.share",
        "command_path": "dashboard share",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardShareResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /dashboards/{dashboard_id}/share",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "ShareDashboard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardShareResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.share",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.signature.create",
        "command_path": "dashboard signature create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardSignatureCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/signatures",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateSignature",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.signature.delete",
        "command_path": "dashboard signature delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SIGNATURE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardSignatureDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/signatures/{signature_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteSignature",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SIGNATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.signature.list",
        "command_path": "dashboard signature list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardSignatureListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/signatures",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSignatures",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSignatureListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.signature.update",
        "command_path": "dashboard signature update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SIGNATURE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardSignatureUpdateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/v3/signatures/{signature_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateSignature",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SIGNATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.source.list",
        "command_path": "dashboard source list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Some servers answer this with HTTP 500.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardSourceListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/sources",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetDashboardSources",
        "pagination_policy": "single_page",
        "preconditions": "Some servers answer this with HTTP 500.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSourceListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_sources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.style.custom.create",
        "command_path": "dashboard style custom create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleCustomCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/styles/custom",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateCustomStyle",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.style.custom.delete",
        "command_path": "dashboard style custom delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: STYLE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleCustomDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/styles/custom/{style_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteCustomStyle",
        "pagination_policy": "none",
        "preconditions": "Required inputs: STYLE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.style.custom.list",
        "command_path": "dashboard style custom list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardStyleCustomListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/styles/custom",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListCustomStyles",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleCustomListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.style.custom.update",
        "command_path": "dashboard style custom update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: STYLE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleCustomUpdateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/v3/styles/custom/{style_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateCustomStyle",
        "pagination_policy": "none",
        "preconditions": "Required inputs: STYLE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.style.default.get",
        "command_path": "dashboard style default get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardStyleDefaultGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/styles/default",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDefaultStyle",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleDefaultGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_default_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.style.default.set",
        "command_path": "dashboard style default set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleDefaultSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/v3/styles/default",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetDefaultStyle",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleDefaultSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_default_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.style.derive",
        "command_path": "dashboard style derive",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleDeriveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/styles/derive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DeriveStyle",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleDeriveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_derive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.style.extract-brand",
        "command_path": "dashboard style extract-brand",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardStyleExtractBrandResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/styles/extract-brand",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExtractBrand",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleExtractBrandResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_extract_brand",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.style.preset.list",
        "command_path": "dashboard style preset list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardStylePresetListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/styles/presets",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListStylePresets",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStylePresetListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_preset_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.style.token.list",
        "command_path": "dashboard style token list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardStyleTokenListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/styles/tokens",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetStyleTokens",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleTokenListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_token_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.suggestion.list",
        "command_path": "dashboard suggestion list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardSuggestionListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/suggestions",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardSuggestions",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSuggestionListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.suggestion_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.swap-data",
        "command_path": "dashboard swap-data",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ObjectJobSchema",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/{dashboard_id}/swap-data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SwapDashboardData",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ObjectJobSchema",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.swap_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.swap-fit",
        "command_path": "dashboard swap-fit",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only check before dashboard swap-data: scores the dashboard (the positional) against up to 60 candidate dataviews, in the order given. Pass target_dataview_ids in --input. Each fit carries a grade (matched, total, reasons) or a skipped reason; too_large means the dataset was not profiled inline, so repeat with include_over_budget for that one. sample_dataview_ids names the template sample data to avoid. No model call, nothing written.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardSwapFitResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/swap/fit",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SwapFit",
        "pagination_policy": "none",
        "preconditions": "Read-only check before dashboard swap-data: scores the dashboard (the positional) against up to 60 candidate dataviews, in the order given. Pass target_dataview_ids in --input. Each fit carries a grade (matched, total, reasons) or a skipped reason; too_large means the dataset was not profiled inline, so repeat with include_over_budget for that one. sample_dataview_ids names the template sample data to avoid. No model call, nothing written.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSwapFitResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.swap_fit",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.tags.delete",
        "command_path": "dashboard tags delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TAG_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTagsDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/tags/{tag_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDashboardTag",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.delete_tag",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.tags.list",
        "command_path": "dashboard tags list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardTagsListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/tags",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListDashboardTags",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTagsListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.list_tags",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.tags.merge",
        "command_path": "dashboard tags merge",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TAG_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTagsMergeResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "POST /dashboards/tags/{tag_id}/merge",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "MergeDashboardTags",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsMergeResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.merge_tag",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.tags.rename",
        "command_path": "dashboard tags rename",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TAG_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTagsRenameResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /dashboards/tags/{tag_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RenameDashboardTag",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsRenameResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rename_tag",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dashboard.tags.set",
        "command_path": "dashboard tags set",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTagsSetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /dashboards/{dashboard_id}/tags",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SetDashboardTags",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsSetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.set_tags",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.template.apply",
        "command_path": "dashboard template apply",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateApplyResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/templates/apply",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ApplyTemplate",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateApplyResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_apply",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.create",
        "command_path": "dashboard template create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "dashboard_id must name a dashboard whose widgets bind dataset columns; a blank dashboard fails with \"None of the columns this template binds are in the dataset\". Build the dashboard first (dashboard create, then widgets), then save it as a template.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateCreateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/templates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SaveTemplate",
        "pagination_policy": "none",
        "preconditions": "dashboard_id must name a dashboard whose widgets bind dataset columns; a blank dashboard fails with \"None of the columns this template binds are in the dataset\". Build the dashboard first (dashboard create, then widgets), then save it as a template.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.delete",
        "command_path": "dashboard template delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateDeleteResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DashboardV3DeleteTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.template.fit",
        "command_path": "dashboard template fit",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardTemplateFitResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/fit",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "FitTemplates",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateFitResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_fit",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.template.get",
        "command_path": "dashboard template get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardTemplateGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3GetTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.template.list",
        "command_path": "dashboard template list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardTemplateListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3ListTemplates",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.preview",
        "command_path": "dashboard template preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplatePreviewResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/templates/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PreviewTemplate",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplatePreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.rename",
        "command_path": "dashboard template rename",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateRenameResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /dashboards/v3/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RenameTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateRenameResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_rename",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.resolve-mapping",
        "command_path": "dashboard template resolve-mapping",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateResolveMappingResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/templates/resolve-mapping",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ResolveTemplateMapping",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateResolveMappingResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_resolve_mapping",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.thumbnail.clear",
        "command_path": "dashboard template thumbnail clear",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes a saved template's picture (owner or workspace admin); its card falls back to the og-card. ok is false when there was no picture.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateThumbnailClearResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/templates/{slug}/thumbnail",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DashboardV3DeleteTemplateThumbnail",
        "pagination_policy": "none",
        "preconditions": "Removes a saved template's picture (owner or workspace admin); its card falls back to the og-card. ok is false when there was no picture.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateThumbnailClearResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_clear",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.template.thumbnail.get",
        "command_path": "dashboard template thumbnail get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The picture a template's card shows, as content_type and content_base64. A template with no picture answers 404; that is an ordinary state and its card falls back to the og-card.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardTemplateThumbnailGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/{slug}/thumbnail",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3TemplateThumbnail",
        "pagination_policy": "none",
        "preconditions": "The picture a template's card shows, as content_type and content_base64. A template with no picture answers 404; that is an ordinary state and its card falls back to the og-card.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateThumbnailGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.template.thumbnail.set",
        "command_path": "dashboard template thumbnail set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Replaces the picture of a SAVED workspace template (owner or workspace admin; curated templates are not writable). PNG, JPEG or WebP read from the file's content, 1 MB at most. The file comes from the local disk.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTemplateThumbnailSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /dashboards/v3/templates/{slug}/thumbnail",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3PutTemplateThumbnail",
        "pagination_policy": "none",
        "preconditions": "Replaces the picture of a SAVED workspace template (owner or workspace admin; curated templates are not writable). PNG, JPEG or WebP read from the file's content, 1 MB at most. The file comes from the local disk.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateThumbnailSetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dashboard.templates.pending",
        "command_path": "dashboard templates pending",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "PendingTemplateResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/templates/pending",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DashboardV3TakePendingTemplate",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "PendingTemplateResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.take_pending_template",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.templates.use",
        "command_path": "dashboard templates use",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SLUG.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ObjectJobSchema | JobResponse",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/templates/{slug}/use",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UseTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SLUG.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ObjectJobSchema | JobResponse",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.use_template",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.trash",
        "command_path": "dashboard trash",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardTrashResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TrashDashboard",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTrashResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.trash",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.unpublished",
        "command_path": "dashboard unpublished",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardUnpublishedResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/unpublished",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUnpublishedChanges",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardUnpublishedResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.unpublished",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "returns_job",
        "canonical_command": "dashboard.update",
        "command_path": "dashboard update",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Updates dashboard fields; read the dashboard first (`dashboard get`).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardUpdateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /dashboards/{dashboard_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditDashboard",
        "pagination_policy": "none",
        "preconditions": "Updates dashboard fields; read the dashboard first (`dashboard get`).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.v3.generate",
        "command_path": "dashboard v3 generate",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "This is how to make a dashboard: it builds and bakes a whole board from one sentence on one view. Input {\"body\": {\"params\": {\"intent\": \"<what the board should show>\", \"dataview_id\": VIEW_ID, \"title\": \"<optional name>\"}}}; waits (about 30 s) and returns the baked canvas, plus dashboard_link and values: the evaluated number of every KPI card and tile (one descriptor-data read of the baked board), so compare them with what you saw in the data before you report. Change it afterwards with dashboard chat edit. dashboard create-blank is only for authoring a canvas by hand.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardV3GenerateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/v3/generate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "GenerateDashboardV3",
        "pagination_policy": "none",
        "preconditions": "This is how to make a dashboard: it builds and bakes a whole board from one sentence on one view. Input {\"body\": {\"params\": {\"intent\": \"<what the board should show>\", \"dataview_id\": VIEW_ID, \"title\": \"<optional name>\"}}}; waits (about 30 s) and returns the baked canvas, plus dashboard_link and values: the evaluated number of every KPI card and tile (one descriptor-data read of the baked board), so compare them with what you saw in the data before you report. Change it afterwards with dashboard chat edit. dashboard create-blank is only for authoring a canvas by hand.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardV3GenerateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.v3_generate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.video.export",
        "command_path": "dashboard video export",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardVideoExportResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/video",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExportVideo",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardVideoExportResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.video_export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dashboard.video-state",
        "command_path": "dashboard video-state",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DashboardVideoStateResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/{dashboard_id}/video-state",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetVideoState",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardVideoStateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.video_state",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.widget-data",
        "command_path": "dashboard widget-data",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DASHBOARD_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardWidgetDataResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/{dashboard_id}/widgets/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "BulkWidgetData",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardWidgetDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.widget_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "dashboard.widget-data-by-url",
        "command_path": "dashboard widget-data-by-url",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: URL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DashboardWidgetDataByUrlResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /dashboards/url/{url}/widgets/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "BulkWidgetDataByUrl",
        "pagination_policy": "none",
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardWidgetDataByUrlResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.widget_data_by_url",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      }
    ],
    "dataset": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.batch-data",
        "command_path": "dataset batch-data",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Dataset and batch parent are explicit; limit is 0..100 and offset is non-negative.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetBatchDataResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}/data",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetBatchData",
        "pagination_policy": "offset",
        "preconditions": "Dataset and batch parent are explicit; limit is 0..100 and offset is non-negative.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetBatchDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_batch_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.broken-rows.list",
        "command_path": "dataset broken-rows list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Returns the first 100 lines the upload could not parse, each with its line number, upload (batch_id) and why it does not fit the columns; row_count is the total. A dataset not made from a file upload has none.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetBrokenRowsListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/unstructured_rows",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUnstructuredRows",
        "pagination_policy": "none",
        "preconditions": "Returns the first 100 lines the upload could not parse, each with its line number, upload (batch_id) and why it does not fit the columns; row_count is the total. A dataset not made from a file upload has none.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetBrokenRowsListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_unstructured_rows",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.broken-rows.resolve",
        "command_path": "dataset broken-rows resolve",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "op \"add\" takes each corrected line (line_num, batch_id and the original line from dataset broken-rows list, edited so its column count matches) into the dataset; op \"remove\" discards the lines for good. Returns a job: run job wait on it, then read broken-rows list (row_count 0 and dataset status ready mean it is finished). Confirm with the user first, and say that discarded lines do not come back.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetBrokenRowsResolveResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/unstructured_rows",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "PatchUnstructuredRows",
        "pagination_policy": "none",
        "preconditions": "op \"add\" takes each corrected line (line_num, batch_id and the original line from dataset broken-rows list, edited so its column count matches) into the dataset; op \"remove\" discards the lines for good. Returns a job: run job wait on it, then read broken-rows list (row_count 0 and dataset status ready mean it is finished). Confirm with the user first, and say that discarded lines do not come back.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBrokenRowsResolveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.resolve_unstructured_rows",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.bulk-delete",
        "command_path": "dataset bulk-delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes every listed dataset for good and cannot be undone. A dataset that another view uses as a lookup or join source is kept, and the result says so. List them first (`dataset list`). Needs a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDatasets",
        "pagination_policy": "none",
        "preconditions": "Deletes every listed dataset for good and cannot be undone. A dataset that another view uses as a lookup or join source is kept, and the result says so. List them first (`dataset list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.bulk_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dataset.bulk-update",
        "command_path": "dataset bulk-update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]; reserved, not registered.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetBulkUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateDatasets",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBulkUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.bulk_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.column-stats",
        "command_path": "dataset column-stats",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs a project. Use this instead of profiling each view when the question spans datasets (\"missing values\", \"blanks\", \"data quality across the project\"): one call returns every dataset's columns with their blank count and share, type and distinct count, from stats stored at the last load or pipeline run. Rank columns by blank_pct (or blank_count) and name the worst dataset and column.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetColumnStatsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/column-stats",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetProjectColumnStats",
        "pagination_policy": "none",
        "preconditions": "Needs a project. Use this instead of profiling each view when the question spans datasets (\"missing values\", \"blanks\", \"data quality across the project\"): one call returns every dataset's columns with their blank count and share, type and distinct count, from stats stored at the last load or pipeline run. Rank columns by blank_pct (or blank_count) and name the worst dataset and column.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetColumnStatsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.column_stats",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "dataset.create",
        "command_path": "dataset create",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "ds_creation_type=weburl (dataset_spec.url), clone, or cloud (a file, REST API or database query from a connection); the command waits for the job and returns the new dataset_id. A weburl dataset keeps its link and can be refreshed on demand (dataset refresh DATASET_ID --yes, or Refresh from URL in the web app; a single CSV only), but never on a schedule: automation's run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); for a scheduled pull from a URL use the REST API connector. Say so rather than scheduling a refresh for it. The result's name is the dataset's real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {\"ds_creation_type\": \"clone\", \"dataset_spec\": {\"ds_name\": NEW_NAME, \"source_ds_id\": ID, \"clone_dataview_ids\": [DEFAULT_VIEW_ID], \"exclude_data\": false}}, DEFAULT_VIEW_ID being the id in dataset's `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"sftp\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"file_path\": PATH_ON_SERVER, \"data_pull_file\": \"Pull same file\"}}}. data_pull_file is a string and may be left out, which means \"Pull same file\" (what the web app does); its only other value is \"Pull next file based on name pattern\", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server's reason; the recipe is recipes/file-import.md. To import from a REST API or Elasticsearch: the connection must exist first (connector connection create generic_rest_api, in the same project); try the query with connector ds-config create (data_sample, creates no dataset; connector connection query takes SQL only and refuses a REST config); then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"generic_rest_api\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"table_name\": TABLE, \"query\": \"<JSON string of the endpoint config>\"}, \"schedule_properties\": {\"schedule_type\": \"moment\", \"first_pull_at\": \"now\", \"on_refresh_action\": \"replace\"}, \"recurrence_info\": {\"interval\": 1, \"start_at\": \"<future ISO time>\"}}}. schedule_properties and recurrence_info are required (without them the job fails with Invalid parameters); on_refresh_action combine appends every refresh, so rows duplicate. The recipe is recipes/rest-api-import.md. To make a dataset from a database query (SQL Server, MySQL, Postgres, ...): connector connection create for the database, try the SELECT with connector connection query (read-only, saves nothing), then connector ds-config create CONNECTOR_KEY CONNECTION_KEY with {\"query\": SELECT, \"table\": NAME}; the recipe is recipes/database-import.md. Other ds_creation_type values and dataset_spec shapes: variants beyond the documented path are not qualified.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateDatasets",
        "pagination_policy": "none",
        "preconditions": "ds_creation_type=weburl (dataset_spec.url), clone, or cloud (a file, REST API or database query from a connection); the command waits for the job and returns the new dataset_id. A weburl dataset keeps its link and can be refreshed on demand (dataset refresh DATASET_ID --yes, or Refresh from URL in the web app; a single CSV only), but never on a schedule: automation's run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); for a scheduled pull from a URL use the REST API connector. Say so rather than scheduling a refresh for it. The result's name is the dataset's real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {\"ds_creation_type\": \"clone\", \"dataset_spec\": {\"ds_name\": NEW_NAME, \"source_ds_id\": ID, \"clone_dataview_ids\": [DEFAULT_VIEW_ID], \"exclude_data\": false}}, DEFAULT_VIEW_ID being the id in dataset's `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"sftp\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"file_path\": PATH_ON_SERVER, \"data_pull_file\": \"Pull same file\"}}}. data_pull_file is a string and may be left out, which means \"Pull same file\" (what the web app does); its only other value is \"Pull next file based on name pattern\", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server's reason; the recipe is recipes/file-import.md. To import from a REST API or Elasticsearch: the connection must exist first (connector connection create generic_rest_api, in the same project); try the query with connector ds-config create (data_sample, creates no dataset; connector connection query takes SQL only and refuses a REST config); then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"generic_rest_api\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"table_name\": TABLE, \"query\": \"<JSON string of the endpoint config>\"}, \"schedule_properties\": {\"schedule_type\": \"moment\", \"first_pull_at\": \"now\", \"on_refresh_action\": \"replace\"}, \"recurrence_info\": {\"interval\": 1, \"start_at\": \"<future ISO time>\"}}}. schedule_properties and recurrence_info are required (without them the job fails with Invalid parameters); on_refresh_action combine appends every refresh, so rows duplicate. The recipe is recipes/rest-api-import.md. To make a dataset from a database query (SQL Server, MySQL, Postgres, ...): connector connection create for the database, try the SELECT with connector connection query (read-only, saves nothing), then connector ds-config create CONNECTOR_KEY CONNECTION_KEY with {\"query\": SELECT, \"table\": NAME}; the recipe is recipes/database-import.md. Other ds_creation_type values and dataset_spec shapes: variants beyond the documented path are not qualified.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.create-from-pdf",
        "command_path": "dataset create-from-pdf",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Add table_list (table indices to extract) to the input: {\"file_name\": \"report.pdf\", \"table_list\": [0]}. The API refuses a call with no table_list. user_instruction cannot be combined with table_list.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetCreateFromPdfResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets-from-pdf",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateDatasetFromPdf",
        "pagination_policy": "none",
        "preconditions": "Add table_list (table indices to extract) to the input: {\"file_name\": \"report.pdf\", \"table_list\": [0]}. The API refuses a call with no table_list. user_instruction cannot be combined with table_list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetCreateFromPdfResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.create_from_pdf",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "dataset.data",
        "command_path": "dataset data",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetDataResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDatasetData",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dataset.definition.add",
        "command_path": "dataset definition add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Saves what a term means for this dataset: term (1-60 characters) and definition (1-300 characters) from --input. A definition is shared by everyone's chats on this dataset, so the user confirms each save. Save one only when the user states what a term means for this data, not to answer a one-off question. Write the definition in terms of the dataset's real column names. A definition for an existing term (any case) replaces it; at most 20 per dataset. The project's definitions already appear in every turn's context, so there is no need to list them before answering.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetDefinitionAddResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddDatasetDefinition",
        "pagination_policy": "none",
        "preconditions": "Saves what a term means for this dataset: term (1-60 characters) and definition (1-300 characters) from --input. A definition is shared by everyone's chats on this dataset, so the user confirms each save. Save one only when the user states what a term means for this data, not to answer a one-off question. Write the definition in terms of the dataset's real column names. A definition for an existing term (any case) replaces it; at most 20 per dataset. The project's definitions already appear in every turn's context, so there is no need to list them before answering.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDefinitionAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.add_definition",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.definition.list",
        "command_path": "dataset definition list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists what terms mean for this dataset (id, term, definition), shared by everyone's chats on it. The project's definitions already appear in every turn's context, so there is no need to list them before answering; list them to find the id to remove.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetDefinitionListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDatasetDefinitions",
        "pagination_policy": "none",
        "preconditions": "Lists what terms mean for this dataset (id, term, definition), shared by everyone's chats on it. The project's definitions already appear in every turn's context, so there is no need to list them before answering; list them to find the id to remove.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDefinitionListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.list_definitions",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "dataset.definition.remove",
        "command_path": "dataset definition remove",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes one definition by the id dataset definition list returns; use it when the user asks to drop or forget what a term means for this dataset. Everyone's chats on the dataset stop using it.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetDefinitionRemoveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions/{definition_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RemoveDatasetDefinition",
        "pagination_policy": "none",
        "preconditions": "Removes one definition by the id dataset definition list returns; use it when the user asks to drop or forget what a term means for this dataset. Everyone's chats on the dataset stop using it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDefinitionRemoveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.remove_definition",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.delete",
        "command_path": "dataset delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable dataset-ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDataset",
        "pagination_policy": "none",
        "preconditions": "Immutable dataset-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "dataset.download",
        "command_path": "dataset download",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: resource_ids (dataset, view and folder ids, in file order) and name (the file name without extension) are required; file_type is csv (a zip of CSVs when there are several) or xlsx (one workbook, a sheet per dataset); stack, numbered, views ({dataset id: view id}), output_path and timeout are optional. An existing output file is refused with file_exists unless --overwrite is given. Check the size first with dataset download-plan.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DatasetDownloadResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Input: resource_ids (dataset, view and folder ids, in file order) and name (the file name without extension) are required; file_type is csv (a zip of CSVs when there are several) or xlsx (one workbook, a sheet per dataset); stack, numbered, views ({dataset id: view id}), output_path and timeout are optional. An existing output file is refused with file_exists unless --overwrite is given. Check the size first with dataset download-plan.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetDownloadResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.download-plan",
        "command_path": "dataset download-plan",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reads headers only: how many datasets a download holds and how many files it is with same-column datasets stacked.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetDownloadPlanResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Reads headers only: how many datasets a download holds and how many files it is with same-column datasets stacked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDownloadPlanResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.file-settings.get",
        "command_path": "dataset file-settings get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetFileSettingsGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetFileSettings",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFileSettingsGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_file_settings",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.file-settings.undo",
        "command_path": "dataset file-settings undo",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetFileSettingsUndoResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "UndoFileSettings",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetFileSettingsUndoResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.file_settings_undo",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "dataset.file-settings.update",
        "command_path": "dataset file-settings update",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetFileSettingsUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateFileSettings",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetFileSettingsUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.file_settings_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.find",
        "command_path": "dataset find",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetFindResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFindResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.from-url.follow",
        "command_path": "dataset from-url follow",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Follow true keeps the dataset refreshing from its link; follow false makes it a copy.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DatasetFromUrlFollowResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Follow true keeps the dataset refreshing from its link; follow false makes it a copy.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetFromUrlFollowResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.from-url.links",
        "command_path": "dataset from-url links",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetFromUrlLinksResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFromUrlLinksResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.from-url.preview",
        "command_path": "dataset from-url preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reads the file at the link and keeps nothing; use it before creating a dataset from a URL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetFromUrlPreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Reads the file at the link and keeps nothing; use it before creating a dataset from a URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFromUrlPreviewResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.get",
        "command_path": "dataset get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDataset",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.interpretation.confirm",
        "command_path": "dataset interpretation confirm",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Finalizes a dataset whose file has more than one plausible reading (status has_unstructured_data): applies the interpretation to the whole file and creates the table. Run interpretation preview first and pass the same input here, or the structure_map it returned. The suggestions stored on the dataset are under additional_info.interpretation.instruction_suggestions in dataset get. Pass mode \"original\" (alone: it takes no reshape field) to keep the file in the layout it was uploaded in; later files for the dataset are then ingested the same way, without review. The result state shows the dataset afterwards. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetInterpretationConfirmResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/interpretation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ConfirmDatasetInterpretation",
        "pagination_policy": "none",
        "preconditions": "Finalizes a dataset whose file has more than one plausible reading (status has_unstructured_data): applies the interpretation to the whole file and creates the table. Run interpretation preview first and pass the same input here, or the structure_map it returned. The suggestions stored on the dataset are under additional_info.interpretation.instruction_suggestions in dataset get. Pass mode \"original\" (alone: it takes no reshape field) to keep the file in the layout it was uploaded in; later files for the dataset are then ingested the same way, without review. The result state shows the dataset afterwards. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetInterpretationConfirmResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.interpretation_confirm",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.interpretation.preview",
        "command_path": "dataset interpretation preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Shows the rows the dataset would have under an interpretation, without finalizing it: preview_rows (header plus up to 50 rows), total_row_count, structure_map and header_types. --input needs user_instruction (plain English; the suggestions stored on the dataset are in dataset get under additional_info.interpretation.instruction_suggestions), a structure_map from an earlier preview, or destination_dataset_id. Nothing is applied to the file until interpretation confirm. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetInterpretationPreviewResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/interpretation/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PreviewDatasetInterpretation",
        "pagination_policy": "none",
        "preconditions": "Shows the rows the dataset would have under an interpretation, without finalizing it: preview_rows (header plus up to 50 rows), total_row_count, structure_map and header_types. --input needs user_instruction (plain English; the suggestions stored on the dataset are in dataset get under additional_info.interpretation.instruction_suggestions), a structure_map from an earlier preview, or destination_dataset_id. Nothing is applied to the file until interpretation confirm. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetInterpretationPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.interpretation_preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.list",
        "command_path": "dataset list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "B01. Newest first. Each item carries rows and cols, created and updated time (updated is left out when it equals created), the source kind (file, connector, created in Mammoth, export of a view), and its column names with types, from the list route's stored stats, sources and data_schema, cut to fit the agent tool output cap: more is true with next_offset when the page was cut. full true returns the raw id and name list. name (input field, a case-insensitive substring) reads every page and returns only the matching datasets as short rows (id, name, rows, cols; no column lists) with matched, and more with next_offset when cut; limit and offset then page over the matches. limit must be at most 100. names true returns up to 500 bare id and name rows of the project in ONE call, newest first, with total and more: use it for a list of names (which files can I see), never page offsets. Without a project use dataset find NAME_SUBSTRING.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetDatasets",
        "pagination_policy": "single_page",
        "preconditions": "B01. Newest first. Each item carries rows and cols, created and updated time (updated is left out when it equals created), the source kind (file, connector, created in Mammoth, export of a view), and its column names with types, from the list route's stored stats, sources and data_schema, cut to fit the agent tool output cap: more is true with next_offset when the page was cut. full true returns the raw id and name list. name (input field, a case-insensitive substring) reads every page and returns only the matching datasets as short rows (id, name, rows, cols; no column lists) with matched, and more with next_offset when cut; limit and offset then page over the matches. limit must be at most 100. names true returns up to 500 bare id and name rows of the project in ONE call, newest first, with total and more: use it for a list of names (which files can I see), never page offsets. Without a project use dataset find NAME_SUBSTRING.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "dataset.refresh",
        "command_path": "dataset refresh",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Fetches the link of a dataset made from a URL (dataset create with ds_creation_type weburl; dataset list shows it as source url with the link host) again into the same dataset, and waits for the job. Whether the new data replaces or adds to the old follows the dataset's own data addition setting. A dataset not made from a URL is refused, and so is a URL that serves JSON; the server's reason is shown. A single CSV only. It never refreshes on a schedule, and automation run_data_retrieval cannot refresh it; for a scheduled pull from a URL use the REST API connector.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DatasetRefreshResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Fetches the link of a dataset made from a URL (dataset create with ds_creation_type weburl; dataset list shows it as source url with the link host) again into the same dataset, and waits for the job. Whether the new data replaces or adds to the old follows the dataset's own data addition setting. A dataset not made from a URL is refused, and so is a URL that serves JSON; the server's reason is shown. A single CSV only. It never refreshes on a schedule, and automation run_data_retrieval cannot refresh it; for a scheduled pull from a URL use the REST API connector.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetRefreshResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.rename",
        "command_path": "dataset rename",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Convenience alias implemented through DatasetsAPI.update but registered as its own canonical command.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DatasetRenameResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Convenience alias implemented through DatasetsAPI.update but registered as its own canonical command.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetRenameResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.restore",
        "command_path": "dataset restore",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetRestoreResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RestoreDataset",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetRestoreResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.schema-diff",
        "command_path": "dataset schema-diff",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DESTINATION_ID, SOURCE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetSchemaDiffResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: DESTINATION_ID, SOURCE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetSchemaDiffResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.search",
        "command_path": "dataset search",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TERM.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetSearchResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/search",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SearchDatasetsByContent",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TERM.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetSearchResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.search",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "dataset.tool-claim.get",
        "command_path": "dataset tool-claim get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetToolClaimGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /tool-claims",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetToolClaim",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetToolClaimGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.tool_claim_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.tool-claim.redeem",
        "command_path": "dataset tool-claim redeem",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The link must have been emailed to the signed-in user. Redeeming it again adds nothing and returns where the tables already are.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetToolClaimRedeemResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/tool-claims",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RedeemToolClaim",
        "pagination_policy": "none",
        "preconditions": "The link must have been emailed to the signed-in user. Redeeming it again adds nothing and returns where the tables already are.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetToolClaimRedeemResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.tool_claim_redeem",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "dataset.trash",
        "command_path": "dataset trash",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetTrashResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TrashDataset",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetTrashResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.trash",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "dataset.update",
        "command_path": "dataset update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]: raw patch operations include rename/refresh/column changes/reattach/deletion; do not dispatch them. Use dataset.rename or dataset.file-settings.update for their typed variants. The pinned SDK has no public binding for the singular UpdateDataset route, so its other OpenAPI patch variants remain unavailable until a typed SDK contract exists.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "DatasetUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateDataset",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]: raw patch operations include rename/refresh/column changes/reattach/deletion; do not dispatch them. Use dataset.rename or dataset.file-settings.update for their typed variants. The pinned SDK has no public binding for the singular UpdateDataset route, so its other OpenAPI patch variants remain unavailable until a typed SDK contract exists.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.update-method.get",
        "command_path": "dataset update-method get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "mode \"add\" means each new file (an upload with append_to_ds_id, or a folder automation) adds its rows to the dataset; \"replace\" means it takes the place of the rows already there. A dataset with no setting stored adds.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DatasetUpdateMethodGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "mode \"add\" means each new file (an upload with append_to_ds_id, or a folder automation) adds its rows to the dataset; \"replace\" means it takes the place of the rows already there. A dataset with no setting stored adds.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetUpdateMethodGetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "dataset.update-method.set",
        "command_path": "dataset update-method set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "mode \"replace\" or \"add\". It stays on the dataset: every later upload into it (file upload with append_to_ds_id) and every folder automation feeding it follows it, until it is set again. Optional schema_mapping {\"dataset column\": [\"file column\"]} matches a new file's columns to the dataset's. The other settings for new rows are kept as stored.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "DatasetUpdateMethodSetResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "mode \"replace\" or \"add\". It stays on the dataset: every later upload into it (file upload with append_to_ds_id) and every folder automation feeding it follows it, until it is set again. Optional schema_mapping {\"dataset column\": [\"file column\"]} matches a new file's columns to the dataset's. The other settings for new rows are kept as stored.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetUpdateMethodSetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "external-key": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "external-key.create",
        "command_path": "external-key create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "secure_key is a secret_fields entry: --input FILE, mode 0600 (shell) or the --input JSON's secure_key field (embedded), behind the confirmation card; never in a reply, note, checkpoint or run log. Response is recursively redacted.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ExternalKeyCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/external_keys",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddExternalKey",
        "pagination_policy": "none",
        "preconditions": "secure_key is a secret_fields entry: --input FILE, mode 0600 (shell) or the --input JSON's secure_key field (embedded), behind the confirmation card; never in a reply, note, checkpoint or run log. Response is recursively redacted.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExternalKeyCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "external-key.delete",
        "command_path": "external-key delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ExternalKeyDeleteResult",
          "scope": "workspace",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/external_keys/{key_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteExternalKey",
        "pagination_policy": "none",
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExternalKeyDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "external-key.get",
        "command_path": "external-key get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: KEY_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ExternalKeyGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/external_keys/{key_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetExternalKey",
        "pagination_policy": "none",
        "preconditions": "Required inputs: KEY_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ExternalKeyGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "external-key.list",
        "command_path": "external-key list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ExternalKeyListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/external_keys",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetKeysByWorkspaceId",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ExternalKeyListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "file": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "file.bulk-delete",
        "command_path": "file bulk-delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes every listed uploaded file for good and cannot be undone. List them first (`file list`). Needs a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/files",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteFiles",
        "pagination_policy": "none",
        "preconditions": "Deletes every listed uploaded file for good and cannot be undone. List them first (`file list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.bulk_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "file.delete",
        "command_path": "file delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Canonical file delete FILE_ID... accepts one or more IDs; resolve every ID before confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteFile",
        "pagination_policy": "none",
        "preconditions": "Canonical file delete FILE_ID... accepts one or more IDs; resolve every ID before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "file.extract-sheets",
        "command_path": "file extract-sheets",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires unique nonempty sheet names. Live upload permission is currently blocked.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "FileExtractSheetsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Requires unique nonempty sheet names. Live upload permission is currently blocked.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileExtractSheetsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "file.get",
        "command_path": "file get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FILE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FileGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetFileDetails",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FILE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FileGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "file.list",
        "command_path": "file list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FileListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/files",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "ListFiles",
        "pagination_policy": "offset",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FileListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "file.multi-sheet-extract",
        "command_path": "file multi-sheet-extract",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {tables: [{sheet_name, dataset_name, structure_map, block_id?, combine_group_id?, source_label?, sheet_block_count?}] (1 to 100 accepted reads from file multi-sheet-preview), delete_file_after_extract?}. The file is deleted after extraction unless delete_file_after_extract is false.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileMultiSheetExtractResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}/multi-sheet-extraction",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateDatasetsFromMultiSheetFile",
        "pagination_policy": "none",
        "preconditions": "Input: {tables: [{sheet_name, dataset_name, structure_map, block_id?, combine_group_id?, source_label?, sheet_block_count?}] (1 to 100 accepted reads from file multi-sheet-preview), delete_file_after_extract?}. The file is deleted after extraction unless delete_file_after_extract is false.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileMultiSheetExtractResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.create_datasets_from_multi_sheet",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "file.multi-sheet-preview",
        "command_path": "file multi-sheet-preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {sheet_name (required), block_id?, user_instruction?, structure_map?}. Shows how one sheet reads before any dataset exists; nothing is saved.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileMultiSheetPreviewResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}/sheets/interpretation/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PreviewMultiSheetInterpretation",
        "pagination_policy": "none",
        "preconditions": "Input: {sheet_name (required), block_id?, user_instruction?, structure_map?}. Shows how one sheet reads before any dataset exists; nothing is saved.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileMultiSheetPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.preview_multi_sheet",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "file.set-password",
        "command_path": "file set-password",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Unlocks a password-protected file: ask the user for the file's password and pass it in --input; never ask for an unlocked copy. The password is secret and never a normal flag.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "FileSetPasswordResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Unlocks a password-protected file: ask the user for the file's password and pass it in --input; never ask for an unlocked copy. The password is secret and never a normal flag.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileSetPasswordResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "file.update",
        "command_path": "file update",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Existing method waits but returns the pre-wait response; must return stable final state. Path extract_pdf_tables takes a typed value (filename, extraction_method tables_only, all_content or custom, optional user_instruction with instruction and instruction_type, preview_page, extract_full_document, delete_file_after_extract) - the extraction setting a dataset's saved recipe replays for PDFs an automation receives.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateFileConfigs",
        "pagination_policy": "none",
        "preconditions": "Existing method waits but returns the pre-wait response; must return stable final state. Path extract_pdf_tables takes a typed value (filename, extraction_method tables_only, all_content or custom, optional user_instruction with instruction and instruction_type, preview_page, extract_full_document, delete_file_after_extract) - the extraction setting a dataset's saved recipe replays for PDFs an automation receives.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "start_or_wait",
        "canonical_command": "file.upload",
        "command_path": "file upload",
        "confirmation": "none",
        "contract": {
          "async": "start_or_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Accepted extensions: csv tsv psv txt xls xlsx xml pdf tiff jpeg jpg png heic webp and archives zip gz bz2 tar 7z (not json). Request size is capped by the ingress in front of the API: a 60 MB upload is refused with HTTP 413 (invalid_argument) before the API sees it; 16 MB is accepted (measured on release 2026-09-19; the cap between them is not pinned down). Keep one upload well under 16 MB: split larger files or upload a zip/gz. Parsing is asynchronous; use --timeout 300 for files past a few MB and poll the returned job on timeout. Upload authorization is tenant- and scope-specific; a permission failure does not make this route universally unavailable. On success retain returned IDs, read them back, and verify owned cleanup; do not assume other upload variants are qualified. Each sheet of an Excel file becomes its own dataset. The input field mode (replace or add) sets the update method of the dataset the file is appended to: it needs append_to_ds_id and cannot be combined with wait_for_completion false (both are usage errors). An upload into a dataset whose columns do not match is not appended: the command fails with code schema_mismatch, rows_added 0 and kept_dataset_ids (the file's own dataset stays in the project as a separate dataset; delete it or fix the file and upload again). The input field override_target_schema (make the file's columns the dataset's) is honoured by the server only when the dataset's update method is replace, which deletes the rows it holds: the CLI refuses it under any other method before sending the file, and without append_to_ds_id or with wait_for_completion false.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FileUploadResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateFileDataset",
        "pagination_policy": "none",
        "preconditions": "Accepted extensions: csv tsv psv txt xls xlsx xml pdf tiff jpeg jpg png heic webp and archives zip gz bz2 tar 7z (not json). Request size is capped by the ingress in front of the API: a 60 MB upload is refused with HTTP 413 (invalid_argument) before the API sees it; 16 MB is accepted (measured on release 2026-09-19; the cap between them is not pinned down). Keep one upload well under 16 MB: split larger files or upload a zip/gz. Parsing is asynchronous; use --timeout 300 for files past a few MB and poll the returned job on timeout. Upload authorization is tenant- and scope-specific; a permission failure does not make this route universally unavailable. On success retain returned IDs, read them back, and verify owned cleanup; do not assume other upload variants are qualified. Each sheet of an Excel file becomes its own dataset. The input field mode (replace or add) sets the update method of the dataset the file is appended to: it needs append_to_ds_id and cannot be combined with wait_for_completion false (both are usage errors). An upload into a dataset whose columns do not match is not appended: the command fails with code schema_mismatch, rows_added 0 and kept_dataset_ids (the file's own dataset stays in the project as a separate dataset; delete it or fix the file and upload again). The input field override_target_schema (make the file's columns the dataset's) is honoured by the server only when the dataset's update method is replace, which deletes the rows it holds: the CLI refuses it under any other method before sending the file, and without append_to_ds_id or with wait_for_completion false.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileUploadResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.files.FilesAPI.upload",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "start_or_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "start_or_wait",
        "canonical_command": "file.upload-folder",
        "command_path": "file upload-folder",
        "confirmation": "none",
        "contract": {
          "async": "start_or_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Nonrecursive; rejects an empty folder. Live upload permission is currently blocked.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "FileUploadFolderResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Nonrecursive; rejects an empty folder. Live upload permission is currently blocked.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileUploadFolderResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "start_or_wait"
      }
    ],
    "folder": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "folder.bulk-delete",
        "command_path": "folder bulk-delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes every listed folder for good and cannot be undone. List them first (`folder list`). Needs a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/folders",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteFolders",
        "pagination_policy": "none",
        "preconditions": "Deletes every listed folder for good and cannot be undone. List them first (`folder list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.bulk_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "folder.create",
        "command_path": "folder create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/folders",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateFolder",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "folder.delete",
        "command_path": "folder delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sorted ID-set confirmation, plus exact project ID and phrase DELETE FOLDER CONTENTS when removing contents.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteFolder",
        "pagination_policy": "none",
        "preconditions": "Sorted ID-set confirmation, plus exact project ID and phrase DELETE FOLDER CONTENTS when removing contents.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "folder.find",
        "command_path": "folder find",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: NAME_SUBSTRING.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FolderFindResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: NAME_SUBSTRING.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderFindResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "folder.get",
        "command_path": "folder get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FOLDER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FolderGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetFolder",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "folder.list",
        "command_path": "folder list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FolderListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "ListFolders",
        "pagination_policy": "offset",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "returns_job",
        "canonical_command": "folder.move",
        "command_path": "folder move",
        "confirmation": "none",
        "contract": {
          "async": "returns_job",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prefer dataset_ids/view_ids (the plain ids dataset get/view get return) over resource_ids -- the SDK resolves them to resource ids for you. resource_ids itself takes each item's resource id, not a dataset/view's own id. target_folder_resource_id is the destination folder's id, exactly as folder list/folder get/folder create return it (the id the web app opens the folder by).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderMoveResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/folders",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateFolderResources",
        "pagination_policy": "none",
        "preconditions": "Prefer dataset_ids/view_ids (the plain ids dataset get/view get return) over resource_ids -- the SDK resolves them to resource ids for you. resource_ids itself takes each item's resource id, not a dataset/view's own id. target_folder_resource_id is the destination folder's id, exactly as folder list/folder get/folder create return it (the id the web app opens the folder by).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderMoveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.move",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "folder.root",
        "command_path": "folder root",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "FolderRootResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderRootResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "folder.trash",
        "command_path": "folder trash",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FOLDER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderTrashResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TrashFolder",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderTrashResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.trash",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "folder.update",
        "command_path": "folder update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FOLDER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "FolderUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateFolderDetails",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.folders.FoldersAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "history": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "history.list",
        "command_path": "history list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists writes made from this machine only. Not available embedded.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "HistoryListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Lists writes made from this machine only. Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HistoryListResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "history.resume",
        "command_path": "history resume",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Resumes a mammoth run or recipe run started on this machine with the journal on. A named result larger than 256 KB is not kept, so a later line that reads it fails. Refuses when a write's outcome is unknown until from_line names where to start. Not available embedded.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "HistoryResumeResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Resumes a mammoth run or recipe run started on this machine with the journal on. A named result larger than 256 KB is not kept, so a later line that reads it fails. Refuses when a write's outcome is unknown until from_line names where to start. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "HistoryResumeResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "history.show",
        "command_path": "history show",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Not available embedded.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "HistoryShowResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HistoryShowResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "history.undo",
        "command_path": "history undo",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Undoes pipeline edits (back to the version before), objects a write created (to the trash) and moves to the trash (restored). Permanent deletes and external effects (exports, sends) cannot be undone and are reported. Not available embedded.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "HistoryUndoResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Undoes pipeline edits (back to the version before), objects a write created (to the trash) and moves to the trash (restored). Permanent deletes and external effects (exports, sends) cannot be undone and are reported. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "HistoryUndoResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "job": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "job.get",
        "command_path": "job get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "timeout parameter on current get_job is unused and stays visible only for public compatibility.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "JobGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /jobs/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetJob",
        "pagination_policy": "none",
        "preconditions": "timeout parameter on current get_job is unused and stays visible only for public compatibility.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.jobs.JobsAPI.get_job",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "job.get-many",
        "command_path": "job get-many",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "CLI accepts repeatable positive integers, not comma strings.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "JobGetManyResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /jobs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetJobs",
        "pagination_policy": "none",
        "preconditions": "CLI accepts repeatable positive integers, not comma strings.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobGetManyResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.jobs.JobsAPI.get_jobs",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "job.wait",
        "command_path": "job wait",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "On success, outcome is the state of what the job acted on: a view run gives the view (rows, cols, columns, status, pipeline_running) from one read, a project copy gives datasets, views, skipped and runs (ok, failed with each error, pending) from the job itself. No view get or view analyze is needed after it. A view that cannot be read is outcome_error, not a failed wait.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "JobWaitResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "On success, outcome is the state of what the job acted on: a view run gives the view (rows, cols, columns, status, pipeline_running) from one read, a project copy gives datasets, views, skipped and runs (ok, failed with each error, pending) from the job itself. No view get or view analyze is needed after it. A view that cannot be read is outcome_error, not a failed wait.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobWaitResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "job.wait-many",
        "command_path": "job wait-many",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reject empty IDs; do not succeed when the server omits a requested job.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "JobWaitManyResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Reject empty IDs; do not succeed when the server omits a requested job.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobWaitManyResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      }
    ],
    "log": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "log.path",
        "command_path": "log path",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "LogPathResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LogPathResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "log.tail",
        "command_path": "log tail",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "LogTailResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LogTailResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "notification": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "notification.delete",
        "command_path": "notification delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: NOTIFICATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "NotificationDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /notifications/{notification_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteNotification",
        "pagination_policy": "none",
        "preconditions": "Required inputs: NOTIFICATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "notification.delete-batch",
        "command_path": "notification delete-batch",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes the matching notifications for good. List them first (`notification list`) with the same filters. Needs a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "NotificationDeleteBatchResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /notifications",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteNotifications",
        "pagination_policy": "none",
        "preconditions": "Deletes the matching notifications for good. List them first (`notification list`) with the same filters. Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationDeleteBatchResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.delete_batch",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "notification.list",
        "command_path": "notification list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "NotificationListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /notifications",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetAllNotifications",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "NotificationListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "notification.update",
        "command_path": "notification update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: NOTIFICATION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "NotificationUpdateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /notifications/{notification_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditNotification",
        "pagination_policy": "none",
        "preconditions": "Required inputs: NOTIFICATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "notification.update-batch",
        "command_path": "notification update-batch",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "NotificationUpdateBatchResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /notifications",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditNotifications",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationUpdateBatchResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.update_batch",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "other": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "calc",
        "command_path": "calc",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Every number reported to the user comes from a tool result: use calc for a single expression, view data compare for a per-key comparison across two views. Never compute a difference or percentage mentally.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CalcResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Every number reported to the user comes from a tool result: use calc for a single expression, view data compare for a per-key comparison across two views. Never compute a difference or percentage mentally.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CalcResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "capabilities",
        "command_path": "capabilities",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists only the known gaps. A goal it does not name may simply be supported; run mammoth how GOAL or mammoth schema find WORDS.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "CapabilitiesResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Lists only the known gaps. A goal it does not name may simply be supported; run mammoth how GOAL or mammoth schema find WORDS.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilitiesResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "doctor",
        "command_path": "doctor",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prints the report either way; exits 4 when the report's ok is false.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "DoctorResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Prints the report either way; exits 4 when the report's ok is false.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DoctorResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "how",
        "command_path": "how",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: GOAL.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "HowResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: GOAL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HowResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "link",
        "command_path": "link",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Folder and selected ids in a link are web app resource ids, not dataset or view ids; only /datasets/ID and /views/ID links carry those directly.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "LinkResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Folder and selected ids in a link are web app resource ids, not dataset or view ids; only /datasets/ID and /views/ID links carry those directly.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LinkResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "report.list",
        "command_path": "report list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ReportListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /reports",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetReports",
        "pagination_policy": "offset",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ReportListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.reports.ReportsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "resolve",
        "command_path": "resolve",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: NAME.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ResolveResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: NAME.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ResolveResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "run",
        "command_path": "run",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "run has no global --yes or --confirm; a mutating line carries its own in flags. Not available embedded.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "RunResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "run has no global --yes or --confirm; a mutating line carries its own in flags. Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "RunResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "upgrade",
        "command_path": "upgrade",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Installs a different mammoth CLI version from PyPI over the current one. Run `mammoth version` first. Needs a prompt or --yes; the install is skipped when the version is already current.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "UpgradeResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Installs a different mammoth CLI version from PyPI over the current one. Run `mammoth version` first. Needs a prompt or --yes; the install is skipped when the version is already current.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "UpgradeResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "version",
        "command_path": "version",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "VersionResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "VersionResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/notify-job",
        "mutation_class": null,
        "operation_id": "AgentNotifyJob",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /oauth/device-approve",
        "mutation_class": null,
        "operation_id": "ApproveDevice",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /oauth/consent",
        "mutation_class": null,
        "operation_id": "Authorize",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /oauth/authorize",
        "mutation_class": null,
        "operation_id": "AuthorizeRedirect",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /collections/reach",
        "mutation_class": null,
        "operation_id": "CollectionsReach",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /workspaces/{workspace_id}/mm-ue",
        "mutation_class": null,
        "operation_id": "Create",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/public/gallery",
        "mutation_class": null,
        "operation_id": "DashboardPublicGallery",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "HEAD /dashboards/public/gallery",
        "mutation_class": null,
        "operation_id": "DashboardPublicGalleryHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/public/gallery/sitemap.xml",
        "mutation_class": null,
        "operation_id": "DashboardPublicGallerySitemap",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "HEAD /dashboards/public/gallery/sitemap.xml",
        "mutation_class": null,
        "operation_id": "DashboardPublicGallerySitemapHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/public/gallery/{slug}",
        "mutation_class": null,
        "operation_id": "DashboardPublicGalleryTemplate",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "HEAD /dashboards/public/gallery/{slug}",
        "mutation_class": null,
        "operation_id": "DashboardPublicGalleryTemplateHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "HEAD /dashboards/public/templates/{slug}",
        "mutation_class": null,
        "operation_id": "DashboardPublicTemplateHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/public/templates/{slug}/thumbnail",
        "mutation_class": null,
        "operation_id": "DashboardPublicTemplateThumbnail",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "HEAD /dashboards/public/templates",
        "mutation_class": null,
        "operation_id": "DashboardPublicTemplatesHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /gdpr_hooks/{integration_name}/deauthorization",
        "mutation_class": null,
        "operation_id": "DeleteUserData",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /oauth/consent/deny",
        "mutation_class": null,
        "operation_id": "Deny",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /oauth/device-deny",
        "mutation_class": null,
        "operation_id": "DenyDevice",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/needs-you/dismiss",
        "mutation_class": null,
        "operation_id": "DismissAgentNeed",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/briefing",
        "mutation_class": null,
        "operation_id": "GetAgentBriefing",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/documents/{sha}",
        "mutation_class": null,
        "operation_id": "GetAgentChatDocument",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/documents/{sha}/pages/{page}",
        "mutation_class": null,
        "operation_id": "GetAgentChatDocumentPage",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/images/{sha}",
        "mutation_class": null,
        "operation_id": "GetAgentChatImage",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/{dashboard_id}/chat/attachments/{sha}",
        "mutation_class": null,
        "operation_id": "GetChatAttachment",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /oauth/consent-info",
        "mutation_class": null,
        "operation_id": "GetConsentInfo",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /oauth/device-info",
        "mutation_class": null,
        "operation_id": "GetDeviceInfo",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /dashboards/{dashboard_id}/head",
        "mutation_class": null,
        "operation_id": "GetDraftHead",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "alias",
        "identity": "GET /workspaces/{workspace_id}/subscription_v1/invoices/{invoice_id}",
        "mutation_class": null,
        "operation_id": "GetInvoice",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /subscription/stripe/webhook",
        "mutation_class": null,
        "operation_id": "HandleStripeWebhook",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "GET /health",
        "mutation_class": null,
        "operation_id": "HealthCheck",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/needs-you",
        "mutation_class": null,
        "operation_id": "ListAgentNeedsYou",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "alias",
        "identity": "GET /workspaces/{workspace_id}/subscription_v1/invoices",
        "mutation_class": null,
        "operation_id": "ListInvoices",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/seen",
        "mutation_class": null,
        "operation_id": "MarkAgentSessionSeen",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/oauth-callback",
        "mutation_class": null,
        "operation_id": "OauthCallback",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /dashboards/{dashboard_id}/presence",
        "mutation_class": null,
        "operation_id": "PostPresence",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/chart-placements",
        "mutation_class": null,
        "operation_id": "RecordAgentChartPlacement",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/chip-feedback",
        "mutation_class": null,
        "operation_id": "RecordAgentChipFeedback",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/events/resources/stream",
        "mutation_class": null,
        "operation_id": "ResourceEventsStream",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /gdpr_hooks/shopify/customers/redact",
        "mutation_class": null,
        "operation_id": "ShopifyCustomerRedact",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /gdpr_hooks/shopify/customers/data_request",
        "mutation_class": null,
        "operation_id": "ShopifyDataRequest",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /gdpr_hooks/shopify/shop/redact",
        "mutation_class": null,
        "operation_id": "ShopifyShopRedact",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /tool-claims",
        "mutation_class": null,
        "operation_id": "StartToolClaim",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /jobs/{job_id}/stream",
        "mutation_class": null,
        "operation_id": "StreamJob",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/sessions/{session_id}/credential-test",
        "mutation_class": null,
        "operation_id": "TestAgentCredentialCard",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /dashboards/{dashboard_id}/track-action",
        "mutation_class": null,
        "operation_id": "TrackAction",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /dashboards/url/{url}/track-heartbeat",
        "mutation_class": null,
        "operation_id": "TrackHeartbeat",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "POST /dashboards/url/{url}/track-view",
        "mutation_class": null,
        "operation_id": "TrackView",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "protocol_only",
        "identity": "GET /unsubscribe",
        "mutation_class": null,
        "operation_id": "UnsubscribeMessaging",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/documents",
        "mutation_class": null,
        "operation_id": "UploadAgentChatDocument",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "POST /agents/images",
        "mutation_class": null,
        "operation_id": "UploadAgentChatImage",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      },
      {
        "acceptance_evidence": null,
        "canonical_command": null,
        "command_path": null,
        "confirmation": null,
        "contract": null,
        "disposition": "internal_only",
        "identity": "GET /agents/sessions/{session_id}/turns/{turn_id}/events",
        "mutation_class": null,
        "operation_id": "WatchAgentTurn",
        "pagination_policy": null,
        "sdk_symbol": null,
        "server_status": null,
        "source": "capability list",
        "unavailable": false,
        "wait_policy": null
      }
    ],
    "parameter": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.create",
        "command_path": "parameter create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "param_type is NUMERIC, TEXT or DATE (uppercase; 4PARM008 otherwise).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterCreateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateParameter",
        "pagination_policy": "none",
        "preconditions": "param_type is NUMERIC, TEXT or DATE (uppercase; 4PARM008 otherwise).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterCreateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.delete",
        "command_path": "parameter delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARAMETER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/parameters/{parameter_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteParameter",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "parameter.dependencies",
        "command_path": "parameter dependencies",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARAMETER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ParameterDependenciesResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/parameters/{parameter_id}/dependencies",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetParameterDependencies",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterDependenciesResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.dependencies",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.duplicate",
        "command_path": "parameter duplicate",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARAMETER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterDuplicateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters/{parameter_id}/duplicate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DuplicateParameter",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterDuplicateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.duplicate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "parameter.get",
        "command_path": "parameter get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARAMETER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ParameterGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/parameters/{parameter_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetParameterDetail",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.group.create",
        "command_path": "parameter group create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterGroupCreateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters/groups",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateGroup",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupCreateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.group.delete",
        "command_path": "parameter group delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: GROUP_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterGroupDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/parameters/groups/{group_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteGroup",
        "pagination_policy": "none",
        "preconditions": "Required inputs: GROUP_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "parameter.group.list",
        "command_path": "parameter group list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ParameterGroupListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/parameters/groups",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListGroups",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterGroupListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.group.reorder",
        "command_path": "parameter group reorder",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterGroupReorderResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters/groups/reorder",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ReorderGroups",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupReorderResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_reorder",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.group.update",
        "command_path": "parameter group update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: GROUP_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterGroupUpdateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/parameters/groups/{group_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateGroup",
        "pagination_policy": "none",
        "preconditions": "Required inputs: GROUP_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "parameter.list",
        "command_path": "parameter list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ParameterListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/parameters",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListParameters",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.rerun",
        "command_path": "parameter rerun",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterRerunResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters/{parameter_id}/rerun",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RerunParameter",
        "pagination_policy": "none",
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterRerunResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.rerun",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.rerun-all-stale",
        "command_path": "parameter rerun-all-stale",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterRerunAllStaleResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/parameters/rerun-all-stale",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RerunAllStale",
        "pagination_policy": "none",
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterRerunAllStaleResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.rerun_all_stale",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "parameter.update",
        "command_path": "parameter update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ParameterUpdateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/parameters/{parameter_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateParameter",
        "pagination_policy": "none",
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.parameters.ParametersAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "project": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.bulk-delete",
        "command_path": "project bulk-delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sorted comma-separated ID-set confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteProjects",
        "pagination_policy": "none",
        "preconditions": "Sorted comma-separated ID-set confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.bulk_delete_and_verify",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "project.bulk-update",
        "command_path": "project bulk-update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Release contract is ProjectsPatch (role add/replace/remove across projects). The CLI requires every patches[].value item to name a project_id and the confirmation names those ids; a body that names no project is refused before dispatch. Not verified live.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectBulkUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/projects",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateProjects",
        "pagination_policy": "none",
        "preconditions": "Release contract is ProjectsPatch (role add/replace/remove across projects). The CLI requires every patches[].value item to name a project_id and the confirmation names those ids; a body that names no project is refused before dispatch. Not verified live.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectBulkUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.bulk_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.check",
        "command_path": "project check",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reads the first view of each dataset (the one uploads and the playbooks use) and one data page per view, six resources at a time. `resources` has one status row per dataset and dashboard with its freshness (in_sync, out_of_sync or running, with data_updated_at) kept apart from its data quality (warning count), or the error that stopped its check. Given DATASET_ID it reads only that dataset's first view and skips the dashboards; also given VIEW_ID it reads that view instead. Every status row names the view_id and view_name it checked, so compare it with the view the work was on.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectCheckResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Reads the first view of each dataset (the one uploads and the playbooks use) and one data page per view, six resources at a time. `resources` has one status row per dataset and dashboard with its freshness (in_sync, out_of_sync or running, with data_updated_at) kept apart from its data quality (warning count), or the error that stopped its check. Given DATASET_ID it reads only that dataset's first view and skips the dashboards; also given VIEW_ID it reads that view instead. Every status row names the view_id and view_name it checked, so compare it with the view the work was on.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectCheckResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.checkpoint.list",
        "command_path": "project checkpoint list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectCheckpointListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/checkpoints",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetProjectCheckpoints",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectCheckpointListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.checkpoint_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "project.copy",
        "command_path": "project copy",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Creates a project: copies the datasets, views and pipelines of PROJECT_ID into a new project NAME, in one job the command waits for. Input fields: dataset_ids (copy only these; default all), include_dashboards (default false), exclude_data (default false, copies pipelines without rows). The result is project_id, dataset_map, view_map, skipped (what was left behind or still points outside the copy) and dashboards (dashboard_id, new_dashboard_id). Needs permission to create projects. Sweep with 'project delete ID --yes --confirm ID'.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectCopyResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/copy",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CopyProject",
        "pagination_policy": "none",
        "preconditions": "Creates a project: copies the datasets, views and pipelines of PROJECT_ID into a new project NAME, in one job the command waits for. Input fields: dataset_ids (copy only these; default all), include_dashboards (default false), exclude_data (default false, copies pipelines without rows). The result is project_id, dataset_map, view_map, skipped (what was left behind or still points outside the copy) and dashboards (dashboard_id, new_dashboard_id). Needs permission to create projects. Sweep with 'project delete ID --yes --confirm ID'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectCopyResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.copy",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.create",
        "command_path": "project create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateProject",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.data-check.list",
        "command_path": "project data-check list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectDataCheckListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/data-checks",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetProjectDataChecks",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectDataCheckListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.data_check_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.delete",
        "command_path": "project delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable project-ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteProject",
        "pagination_policy": "none",
        "preconditions": "Immutable project-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.delete_and_verify",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.ensure",
        "command_path": "project ensure",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Matches the exact, case-sensitive name; several projects with the same name resolve to the lowest id and the rest are listed under 'duplicates'. Creating a project is a benign mutation; sweep with 'project delete ID --yes --confirm ID'.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ProjectEnsureResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Matches the exact, case-sensitive name; several projects with the same name resolve to the lowest id and the rest are listed under 'duplicates'. Creating a project is a benign mutation; sweep with 'project delete ID --yes --confirm ID'.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectEnsureResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.get",
        "command_path": "project get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Reads one project by id. A token limited to one project can read only that project.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "single_page",
        "preconditions": "Reads one project by id. A token limited to one project can read only that project.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectGetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.list",
        "command_path": "project list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "B01 FIRST_PAGE_ONLY: no offset/cursor continuation proven yet.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetProject",
        "pagination_policy": "single_page",
        "preconditions": "B01 FIRST_PAGE_ONLY: no offset/cursor continuation proven yet.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.memory.add",
        "command_path": "project memory add",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Save only a preference the user stated for how the agent works or shows things (at most 20, each at most 200 characters); never data, results or secrets. The in-app agent applies them in every later turn in this project. A rule about what a board's data means (for example, Returned orders are refunds) belongs to that board: dashboard context create.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ProjectMemoryAddResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Save only a preference the user stated for how the agent works or shows things (at most 20, each at most 200 characters); never data, results or secrets. The in-app agent applies them in every later turn in this project. A rule about what a board's data means (for example, Returned orders are refunds) belongs to that board: dashboard context create.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectMemoryAddResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.memory.list",
        "command_path": "project memory list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The saved preferences are the caller's own, per project, oldest first; the in-app agent reads them at the start of every turn. Remove one by its zero-based position in this list.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectMemoryListResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "The saved preferences are the caller's own, per project, oldest first; the in-app agent reads them at the start of every turn. Remove one by its zero-based position in this list.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectMemoryListResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.memory.remove",
        "command_path": "project memory remove",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "index is the zero-based position from project memory list; use it when the user asks to forget a preference.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ProjectMemoryRemoveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "index is the zero-based position from project memory list; use it when the user asks to forget a preference.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectMemoryRemoveResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "project.needs-attention",
        "command_path": "project needs-attention",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The rows of the Monitor Needs Attention tab for one project (the app has no workspace-wide list): pipeline_error, pending_pipeline, pending_data, checkpoint (needs approval), data_check (failed), each with view_id and the owning dataset_id, and needs_input (a file or dataset waiting for a person; action is unstructured_rows, ambiguous_date_format, password_required, sheet_selection_required or schema_mismatch); datasets lists each affected dataset once with its view_ids. Pending retentions are not returned by the API and are not included. To delete the datasets behind the views, take dataset_id from datasets and run dataset delete or dataset bulk-delete (confirm first).",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectNeedsAttentionResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "The rows of the Monitor Needs Attention tab for one project (the app has no workspace-wide list): pipeline_error, pending_pipeline, pending_data, checkpoint (needs approval), data_check (failed), each with view_id and the owning dataset_id, and needs_input (a file or dataset waiting for a person; action is unstructured_rows, ambiguous_date_format, password_required, sheet_selection_required or schema_mismatch); datasets lists each affected dataset once with its view_ids. Pending retentions are not returned by the API and are not included. To delete the datasets behind the views, take dataset_id from datasets and run dataset delete or dataset bulk-delete (confirm first).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectNeedsAttentionResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.pending-changes",
        "command_path": "project pending-changes",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectPendingChangesResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/pending-changes",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPendingChanges",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectPendingChangesResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.pending_changes",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.publish-credentials",
        "command_path": "project publish-credentials",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectPublishCredentialsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/credentials",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPublishCredentials",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectPublishCredentialsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.publish_credentials",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.resource-dependencies",
        "command_path": "project resource-dependencies",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectResourceDependenciesResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resource-dependencies",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetResourceDependencies",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectResourceDependenciesResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_dependencies",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "always_wait",
        "canonical_command": "project.resource-dependencies.update",
        "command_path": "project resource-dependencies update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "always_wait",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes the resources the project declares it depends on; views and dashboards that read through a removed dependency can stop resolving data. Read the current set first (`project resource-dependencies`). Needs --yes and --confirm PROJECT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectResourceDependenciesUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/resource-dependencies",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "BulkModify",
        "pagination_policy": "none",
        "preconditions": "Changes the resources the project declares it depends on; views and dashboards that read through a removed dependency can stop resolving data. Read the current set first (`project resource-dependencies`). Needs --yes and --confirm PROJECT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectResourceDependenciesUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_dependencies_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "project.resource-status",
        "command_path": "project resource-status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ProjectResourceStatusResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resource-status",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetResourceStatus",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectResourceStatusResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_status",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.sample-flow",
        "command_path": "project sample-flow",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectSampleFlowResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sample-flow",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateSampleFlow",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectSampleFlowResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.sample_flow",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.update",
        "command_path": "project update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateProject",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "project.user.add",
        "command_path": "project user add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED. role is required, and a user who is already a project member is refused (the backend would replace that member's role, demoting an admin); change roles with project user update. Takes existing workspace users' ids. To add someone by email who is not in the workspace yet, use workspace user add with {\"email_ids\": [EMAIL], \"projects\": [{\"project_id\": PROJECT_ID, \"role\": ROLE}]}: it invites them as a workspace member with that project role, which is how a project gets a new person.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectUserAddResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddUserProject",
        "pagination_policy": "none",
        "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED. role is required, and a user who is already a project member is refused (the backend would replace that member's role, demoting an admin); change roles with project user update. Takes existing workspace users' ids. To add someone by email who is not in the workspace yet, use workspace user add with {\"email_ids\": [EMAIL], \"projects\": [{\"project_id\": PROJECT_ID, \"role\": ROLE}]}: it invites them as a workspace member with that project role, which is how a project gets a new person.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.add_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "project.user.remove",
        "command_path": "project user remove",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED; sorted target-set confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectUserRemoveResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RemoveUserProject",
        "pagination_policy": "none",
        "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED; sorted target-set confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserRemoveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.remove_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "project.user.update",
        "command_path": "project user update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes one project member's role (role plus exactly one of user_id or invite_id); the person gains or loses access at once. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ProjectUserUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateUserProject",
        "pagination_policy": "none",
        "preconditions": "Changes one project member's role (role plus exactly one of user_id or invite_id); the person gains or loses access at once. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.projects.ProjectsAPI.user_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "recipe": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "recipe.list",
        "command_path": "recipe list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "RecipeListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "RecipeListResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "recipe.run",
        "command_path": "recipe run",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Runs only the recipes 'recipe list' shows. Stops at the first failed step; 'mammoth history undo' with the run's group reverses the writes. Not available embedded.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "RecipeRunResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Runs only the recipes 'recipe list' shows. Stops at the first failed step; 'mammoth history undo' with the run's group reverses the writes. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "RecipeRunResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "schedule": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "schedule.create",
        "command_path": "schedule create",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[SCHEDULE_CREATE_NOT_IMPLEMENTED]: the backend answers 5GENR011 NOT_IMPLEMENTED; the command fails with feature_unavailable and makes no API call. Use `mammoth automation create` instead.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ScheduleCreateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/schedules",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "CreateSchedule",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[SCHEDULE_CREATE_NOT_IMPLEMENTED]: the backend answers 5GENR011 NOT_IMPLEMENTED; the command fails with feature_unavailable and makes no API call. Use `mammoth automation create` instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": true,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "schedule.delete",
        "command_path": "schedule delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ScheduleDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteSchedule",
        "pagination_policy": "none",
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "schedule.get",
        "command_path": "schedule get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SCHEDULE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ScheduleGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSchedule",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SCHEDULE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ScheduleGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "schedule.list",
        "command_path": "schedule list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Retired: the command answers not_available and names the web app. No Mammoth server can list schedules for a project (GET answers HTTP 400 NOT_IMPLEMENTED), so do not poll it. Use `schedule get SCHEDULE_ID` with an id obtained elsewhere.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ScheduleListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/schedules",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "ListSchedules",
        "pagination_policy": "offset",
        "preconditions": "Retired: the command answers not_available and names the web app. No Mammoth server can list schedules for a project (GET answers HTTP 400 NOT_IMPLEMENTED), so do not poll it. Use `schedule get SCHEDULE_ID` with an id obtained elsewhere.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ScheduleListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "schedule.update",
        "command_path": "schedule update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "status=resume requires exact ID confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ScheduleUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "PatchSchedule",
        "pagination_policy": "none",
        "preconditions": "status=resume requires exact ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "schema": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "schema.find",
        "command_path": "schema find",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: QUERY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SchemaFindResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: QUERY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaFindResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "schema.get",
        "command_path": "schema get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: COMMAND_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SchemaGetResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: COMMAND_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaGetResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "schema.list",
        "command_path": "schema list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SchemaListResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaListResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "skill": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.agents-md.install",
        "command_path": "skill agents-md install",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes one <mammoth-cli>…</mammoth-cli> block into AGENTS.md in the current directory (--input '{\"path\": \"CLAUDE.md\"}' for another file); re-running replaces the block in place. Local file write only.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "SkillAgentsMdInstallResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Writes one <mammoth-cli>…</mammoth-cli> block into AGENTS.md in the current directory (--input '{\"path\": \"CLAUDE.md\"}' for another file); re-running replaces the block in place. Local file write only.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillAgentsMdInstallResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.install",
        "command_path": "skill install",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "SkillInstallResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillInstallResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.list",
        "command_path": "skill list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SkillListResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillListResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.path",
        "command_path": "skill path",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SkillPathResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillPathResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.show",
        "command_path": "skill show",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prints the bundled SKILL.md under data.text; --input '{\"file\": \"references/recipes/transforms.md\"}' prints one reference file. Read-only, local.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SkillShowResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Prints the bundled SKILL.md under data.text; --input '{\"file\": \"references/recipes/transforms.md\"}' prints one reference file. Read-only, local.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillShowResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.uninstall",
        "command_path": "skill uninstall",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "SkillUninstallResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillUninstallResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "skill.update",
        "command_path": "skill update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "SkillUpdateResult",
          "scope": "local",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillUpdateResult",
        "scope": "local",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "snippet": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "snippet.create",
        "command_path": "snippet create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SnippetCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/snippets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateSnippet",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "snippet.delete",
        "command_path": "snippet delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SnippetDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/snippets/{snippet_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteSnippet",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "snippet.dependencies",
        "command_path": "snippet dependencies",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SnippetDependenciesResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/snippets/{snippet_id}/dependencies",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSnippetDependencies",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetDependenciesResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.dependencies",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "snippet.duplicate",
        "command_path": "snippet duplicate",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SnippetDuplicateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/snippets/{snippet_id}/duplicate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DuplicateSnippet",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetDuplicateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.duplicate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "snippet.get",
        "command_path": "snippet get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SnippetGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/snippets/{snippet_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSnippetDetail",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "snippet.list",
        "command_path": "snippet list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SnippetListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/snippets",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSnippets",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "snippet.rerun",
        "command_path": "snippet rerun",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SnippetRerunResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/snippets/{snippet_id}/rerun",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RerunSnippet",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetRerunResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.rerun",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "snippet.update",
        "command_path": "snippet update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: SNIPPET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SnippetUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/snippets/{snippet_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateSnippet",
        "pagination_policy": "none",
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "support": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.cancel-subscription",
        "command_path": "support billing cancel-subscription",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. `when` is required: now ends access and billing at once, period_end keeps the workspace until the paid period ends. Check `support workspace entitlement WORKSPACE_ID` first.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingCancelSubscriptionResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/billing/{workspace_id}/cancel-subscription",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportCancelSubscription",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. `when` is required: now ends access and billing at once, period_end keeps the workspace until the paid period ends. Check `support workspace entitlement WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingCancelSubscriptionResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_cancel_subscription",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.change-plan",
        "command_path": "support billing change-plan",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Look the plan up with `support plan catalog`; `when` is now or period_end. A change now is prorated and billed at once.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingChangePlanResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/billing/{workspace_id}/change-plan",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportChangePlan",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Look the plan up with `support plan catalog`; `when` is now or period_end. A change now is prorated and billed at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingChangePlanResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_change_plan",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.end-trial",
        "command_path": "support billing end-trial",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Ends the trial now and charges the plan; the card on file is billed.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingEndTrialResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/billing/{workspace_id}/end-trial",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportEndTrial",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Ends the trial now and charges the plan; the card on file is billed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingEndTrialResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_end_trial",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.refund",
        "command_path": "support billing refund",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Moves money back to the customer, and it cannot be undone. Exactly one of `amount` (positive whole cents, a partial refund) or `full: true` (the whole last payment) is required: neither, or both, is refused, so a refund is never full by omission. The confirmation text names the amount or FULL.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingRefundResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "POST /support/billing/{workspace_id}/refund",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "SupportRefund",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Moves money back to the customer, and it cannot be undone. Exactly one of `amount` (positive whole cents, a partial refund) or `full: true` (the whole last payment) is required: neither, or both, is refused, so a refund is never full by omission. The confirmation text names the amount or FULL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingRefundResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_refund",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.retry-payment",
        "command_path": "support billing retry-payment",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Charges the failed invoice again; the card on file is billed.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingRetryPaymentResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/billing/{workspace_id}/retry-payment",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportRetryPayment",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Charges the failed invoice again; the card on file is billed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingRetryPaymentResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_retry_payment",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.billing.start-trial",
        "command_path": "support billing start-trial",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Starts a trial of `days` (1-60) on the workspace. It REPLACES the workspace's billing and cancels a live paid Stripe subscription. Check `support workspace entitlement WORKSPACE_ID` first.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportBillingStartTrialResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/billing/{workspace_id}/start-trial",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportStartTrial",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Starts a trial of `days` (1-60) on the workspace. It REPLACES the workspace's billing and cancels a live paid Stripe subscription. Check `support workspace entitlement WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingStartTrialResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.billing_start_trial",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector.bucket-impact",
        "command_path": "support connector bucket-impact",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportConnectorBucketImpactResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/connectors/{connector_id}/bucket-impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportConnectorBucketImpact",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorBucketImpactResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_bucket_impact",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector.create",
        "command_path": "support connector create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Adds a connector to the catalog for every workspace. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/connectors",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateConnector",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Adds a connector to the catalog for every workspace. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector.delete",
        "command_path": "support connector delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/connectors/{connector_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteConnector",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector.list",
        "command_path": "support connector list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportConnectorListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/connectors",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSubscriptionConnectors",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector.update",
        "command_path": "support connector update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: CONNECTOR_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/connectors/{connector_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateConnector",
        "pagination_policy": "none",
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector-profile.add-connector",
        "command_path": "support connector-profile add-connector",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID, CONNECTOR_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorProfileAddConnectorResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/connector-profiles/{profile_id}/connectors",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddConnectorToProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID, CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileAddConnectorResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_add_connector",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector-profile.create",
        "command_path": "support connector-profile create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Creates a connector profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorProfileCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/connector-profiles",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateConnectorProfile",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Creates a connector profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector-profile.delete",
        "command_path": "support connector-profile delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorProfileDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/connector-profiles/{profile_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteConnectorProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector-profile.list",
        "command_path": "support connector-profile list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportConnectorProfileListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/connector-profiles",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListConnectorProfiles",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorProfileListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.connector-profile.update",
        "command_path": "support connector-profile update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportConnectorProfileUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/connector-profiles/{profile_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateConnectorProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.activity",
        "command_path": "support deal activity",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DEAL_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportDealActivityResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/deals/{deal_id}/activity",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportDealActivity",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealActivityResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_activity",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.cancel-move-to-partner",
        "command_path": "support deal cancel-move-to-partner",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the deal's pending move to a partner; read the deal first with `support deal get DEAL_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportDealCancelMoveToPartnerResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /support/deals/{deal_id}/move-to-partner",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportDealCancelMoveToPartner",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the deal's pending move to a partner; read the deal first with `support deal get DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealCancelMoveToPartnerResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_cancel_move_to_partner",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.create",
        "command_path": "support deal create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Needs `base_plan_id` and exactly one of the WORKSPACE_ID argument or `workspace_create`. A deal sets what the workspace is billed and entitled to.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportDealCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/deals",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportCreateDeal",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Needs `base_plan_id` and exactly one of the WORKSPACE_ID argument or `workspace_create`. A deal sets what the workspace is billed and entitled to.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.get",
        "command_path": "support deal get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DEAL_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportDealGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/deals/{deal_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportGetDeal",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.list",
        "command_path": "support deal list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportDealListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/deals",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "SupportListDeals",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.move-to-partner",
        "command_path": "support deal move-to-partner",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the deal's billing under a partner (`when`: period_end or now). With `when` now, the workspace's subscription is cancelled prorated and the unused time is refunded. Undo a pending move with `support deal cancel-move-to-partner DEAL_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportDealMoveToPartnerResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/deals/{deal_id}/move-to-partner",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportDealMoveToPartner",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the deal's billing under a partner (`when`: period_end or now). With `when` now, the workspace's subscription is cancelled prorated and the unused time is refunded. Undo a pending move with `support deal cancel-move-to-partner DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealMoveToPartnerResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_move_to_partner",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.opt-in",
        "command_path": "support deal opt-in",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Releases opt-in rollout pins on the deal (`keys`, `connectors`, or `everything`), which can change the workspace's entitlements at once.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportDealOptInResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/deals/{deal_id}/opt-in",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportDealOptIn",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Releases opt-in rollout pins on the deal (`keys`, `connectors`, or `everything`), which can change the workspace's entitlements at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealOptInResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_opt_in",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.preview-entitlement",
        "command_path": "support deal preview-entitlement",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DEAL_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportDealPreviewEntitlementResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/deals/{deal_id}/preview-entitlement",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportPreviewDealEntitlement",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealPreviewEntitlementResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_preview_entitlement",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.deal.update",
        "command_path": "support deal update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Changes what the workspace is billed and entitled to; a bad status turns entitlements off. Read the deal first with `support deal get DEAL_ID`, and preview the result with `support deal preview-entitlement DEAL_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportDealUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /support/deals/{deal_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportUpdateDeal",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Changes what the workspace is billed and entitled to; a bad status turns entitlements off. Read the deal first with `support deal get DEAL_ID`, and preview the result with `support deal preview-entitlement DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.deal_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.entitlement.registry",
        "command_path": "support entitlement registry",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportEntitlementRegistryResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/entitlements",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportEntitlementRegistry",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportEntitlementRegistryResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.entitlement_registry",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature.create",
        "command_path": "support feature create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Adds a feature flag to the catalog for every workspace. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/features",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateFeature",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Adds a feature flag to the catalog for every workspace. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature.delete",
        "command_path": "support feature delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FEATURE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/features/{feature_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteFeature",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature.list",
        "command_path": "support feature list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportFeatureListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/features",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListFeatures",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportFeatureListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature.update",
        "command_path": "support feature update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: FEATURE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/features/{feature_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateFeature",
        "pagination_policy": "none",
        "preconditions": "Required inputs: FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature-profile.add-feature",
        "command_path": "support feature-profile add-feature",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID, FEATURE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureProfileAddFeatureResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/feature-profiles/{profile_id}/features",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddFeatureToProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID, FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileAddFeatureResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_add_feature",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature-profile.create",
        "command_path": "support feature-profile create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Creates a feature profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureProfileCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/feature-profiles",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateFeatureProfile",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Creates a feature profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature-profile.delete",
        "command_path": "support feature-profile delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureProfileDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/feature-profiles/{profile_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteFeatureProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature-profile.list",
        "command_path": "support feature-profile list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportFeatureProfileListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/feature-profiles",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListFeatureProfiles",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportFeatureProfileListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.feature-profile.update",
        "command_path": "support feature-profile update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PROFILE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportFeatureProfileUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/feature-profiles/{profile_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateFeatureProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.identity.get",
        "command_path": "support identity get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: USER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportIdentityGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/identities/{user_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportGetIdentity",
        "pagination_policy": "none",
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportIdentityGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.identity_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.identity.list",
        "command_path": "support identity list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportIdentityListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/identities",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "SupportListIdentities",
        "pagination_policy": "offset",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportIdentityListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.identity_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.ownership.transfer",
        "command_path": "support ownership transfer",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportOwnershipTransferResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /settings/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "TransferOwnerships",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportOwnershipTransferResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.ownership_transfer",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.activity",
        "command_path": "support partner activity",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARTNER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerActivityResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners/{partner_id}/activity",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportPartnerActivity",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerActivityResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_activity",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.billing",
        "command_path": "support partner billing",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARTNER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerBillingResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners/{partner_id}/billing",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportGetPartnerBilling",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerBillingResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_billing",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.charge-invoices",
        "command_path": "support partner charge-invoices",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Charges every open invoice of the partner now; the partner's card on file is billed. Look at them first with `support partner invoices PARTNER_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerChargeInvoicesResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/partners/{partner_id}/charge-invoices",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportChargePartnerInvoices",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Charges every open invoice of the partner now; the partner's card on file is billed. Look at them first with `support partner invoices PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerChargeInvoicesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_charge_invoices",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.client.cancel-detach",
        "command_path": "support partner client cancel-detach",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the client's pending detach. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List the clients first with `support partner client list PARTNER_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerClientCancelDetachResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /support/partners/{partner_id}/workspaces/{workspace_id}/detach",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportCancelDetachClient",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the client's pending detach. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List the clients first with `support partner client list PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientCancelDetachResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_cancel_detach",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.client.delete",
        "command_path": "support partner client delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Deletes the client workspace of the partner, and it cannot be undone. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List them first with `support partner client list PARTNER_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerClientDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /support/partners/{partner_id}/workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "SupportDeletePartnerClient",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Deletes the client workspace of the partner, and it cannot be undone. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List them first with `support partner client list PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.client.detach",
        "command_path": "support partner client detach",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Turns the partner's client into a direct customer: `price` (above 0) and `contact_email` are required. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. Undo a pending detach with `support partner client cancel-detach PARTNER_ID WORKSPACE_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerClientDetachResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/partners/{partner_id}/workspaces/{workspace_id}/detach",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportDetachClient",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Turns the partner's client into a direct customer: `price` (above 0) and `contact_email` are required. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. Undo a pending detach with `support partner client cancel-detach PARTNER_ID WORKSPACE_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientDetachResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_detach",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.client.list",
        "command_path": "support partner client list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: PARTNER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerClientListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners/{partner_id}/workspaces",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "SupportListPartnerClients",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerClientListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.create",
        "command_path": "support partner create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Creates a partner record; no money moves.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/partners",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportCreatePartner",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Creates a partner record; no money moves.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.get",
        "command_path": "support partner get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARTNER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners/{partner_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportGetPartner",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.invoices",
        "command_path": "support partner invoices",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PARTNER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerInvoicesResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners/{partner_id}/invoices",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportListPartnerInvoices",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerInvoicesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_invoices",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.list",
        "command_path": "support partner list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPartnerListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/partners",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "SupportListPartners",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.send-payment-link",
        "command_path": "support partner send-payment-link",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the partner contact a payment link; the email goes out at once.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerSendPaymentLinkResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/partners/{partner_id}/send-payment-link",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportSendPartnerPaymentLink",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the partner contact a payment link; the email goes out at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerSendPaymentLinkResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_send_payment_link",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.partner.update",
        "command_path": "support partner update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. An empty string clears contact_name, contact_email or notes. billing_method sets how the partner's consolidated subscription is collected.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPartnerUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /support/partners/{partner_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportUpdatePartner",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. An empty string clears contact_name, contact_email or notes. billing_method sets how the partner's consolidated subscription is collected.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.partner_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.archive",
        "command_path": "support plan archive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanArchiveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/plans/{plan_id}/archive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ArchivePlan",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanArchiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_archive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.catalog",
        "command_path": "support plan catalog",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanCatalogResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/plans/catalog",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportPlansCatalog",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanCatalogResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_catalog",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.chargebee-list",
        "command_path": "support plan chargebee-list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanChargebeeListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/sms",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPlans",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanChargebeeListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_chargebee_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.create",
        "command_path": "support plan create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Creates a billing plan that workspaces can subscribe to. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/plans",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreatePlan",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Creates a billing plan that workspaces can subscribe to. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.delete",
        "command_path": "support plan delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/plans/{plan_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeletePlan",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.get",
        "command_path": "support plan get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/plans/{plan_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPlan",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.list",
        "command_path": "support plan list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/plans",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSubscriptionPlans",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.self-serve-list",
        "command_path": "support plan self-serve-list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanSelfServeListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/self-serve-plans",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListSelfServePlans",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanSelfServeListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_self_serve_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.storage-option.archive",
        "command_path": "support plan storage-option archive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Retires the option so it can no longer be chosen; never deleted, subscriptions billed at that size keep it. Confirm with the option id.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanStorageOptionArchiveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /subscription/plans/{plan_id}/storage-options/{option_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ArchiveStorageOption",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Retires the option so it can no longer be chosen; never deleted, subscriptions billed at that size keep it. Confirm with the option id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionArchiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_archive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.storage-option.create",
        "command_path": "support plan storage-option create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Adds a purchasable storage size to an inline-pricing plan. storage_gb is the TOTAL allocation, not an increment; prices are the monthly and annual add on top of the plan price.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanStorageOptionCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/plans/{plan_id}/storage-options",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateStorageOption",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Adds a purchasable storage size to an inline-pricing plan. storage_gb is the TOTAL allocation, not an increment; prices are the monthly and annual add on top of the plan price.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.plan.storage-option.list",
        "command_path": "support plan storage-option list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every purchasable storage size of the plan, archived ones included.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportPlanStorageOptionListResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /subscription/plans/{plan_id}/storage-options",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListStorageOptions",
        "pagination_policy": "single_page",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every purchasable storage size of the plan, archived ones included.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanStorageOptionListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.storage-option.update",
        "command_path": "support plan storage-option update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-prices or resizes one storage option; send at least one of storage_gb, monthly_price, annual_price. Confirm with the option id.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanStorageOptionUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/plans/{plan_id}/storage-options/{option_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateStorageOption",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-prices or resizes one storage option; send at least one of storage_gb, monthly_price, annual_price. Confirm with the option id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.unarchive",
        "command_path": "support plan unarchive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Unarchives a plan archived with support plan archive.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanUnarchiveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /subscription/plans/{plan_id}/unarchive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UnarchivePlan",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Unarchives a plan archived with support plan archive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUnarchiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_unarchive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.update",
        "command_path": "support plan update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/plans/{plan_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdatePlan",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.update-entitlements",
        "command_path": "support plan update-entitlements",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes what every workspace on the plan is granted, at once. Legacy and system plans are read-only. Read `support plan get` first. Needs --yes and --confirm PLAN_ID (the refusal prints the exact target). --dry-run names the plan and the new values; the plan's current values are not readable from a mapped read, so compare with the plans matrix.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanUpdateEntitlementsResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/plans/{plan_id}/entitlements",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdatePlanEntitlements",
        "pagination_policy": "none",
        "preconditions": "Changes what every workspace on the plan is granted, at once. Legacy and system plans are read-only. Read `support plan get` first. Needs --yes and --confirm PLAN_ID (the refusal prints the exact target). --dry-run names the plan and the new values; the plan's current values are not readable from a mapped read, so compare with the plans matrix.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateEntitlementsResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update_entitlements",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.plan.update-storage-tiers",
        "command_path": "support plan update-storage-tiers",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportPlanUpdateStorageTiersResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /subscription/plans/{plan_id}/storage-tiers",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateStorageTiers",
        "pagination_policy": "none",
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateStorageTiersResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update_storage_tiers",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.project-move.get",
        "command_path": "support project-move get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Needs no workspace header. A move that is stalled (its worker died) resumes when `support workspace project move-start` runs again.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportProjectMoveGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/project-moves/{move_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetProjectMove",
        "pagination_policy": "none",
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Needs no workspace header. A move that is stalled (its worker died) resumes when `support workspace project move-start` runs again.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportProjectMoveGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.project-move.purge",
        "command_path": "support project-move purge",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Refused for a move that is not finished.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportProjectMovePurgeResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/project-moves/{move_id}/purge",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "PurgeProjectMove",
        "pagination_policy": "none",
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Refused for a move that is not finished.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportProjectMovePurgeResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_purge",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.search",
        "command_path": "support search",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportSearchResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/search",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportSearch",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportSearchResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.search",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.subscription.create",
        "command_path": "support subscription create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID, PLAN_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportSubscriptionCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/sms",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RegisterSubscription",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID, PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportSubscriptionCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.subscription.get",
        "command_path": "support subscription get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportSubscriptionGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/sms",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetSubscriptionDetail",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportSubscriptionGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.subscription.update",
        "command_path": "support subscription update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID, SUBSCRIPTION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportSubscriptionUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /support/workspaces/{workspace_id}/sms",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateSubscription",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID, SUBSCRIPTION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportSubscriptionUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.audit",
        "command_path": "support template audit",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-runs every curated-catalog gate: faults with remedies, checked, and curated entries never seeded (missing). Read-only.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateAuditResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/audit",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminAudit",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-runs every curated-catalog gate: faults with remedies, checked, and curated entries never seeded (missing). Read-only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateAuditResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_audit",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.canvas",
        "command_path": "support template canvas",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. The template's canvas with its baked plan and specs, drafts included.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateCanvasResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/{slug}/canvas",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminRowCanvas",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. The template's canvas with its baked plan and specs, drafts included.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateCanvasResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_canvas",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.data-preview",
        "command_path": "support template data-preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Up to 50 rows of the data the template opens on; capped says whether there are more.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateDataPreviewResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/{slug}/data-preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminDataPreview",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Up to 50 rows of the data the template opens on; capped says whether there are more.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateDataPreviewResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_data_preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.discard",
        "command_path": "support template discard",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Permanently removes a curated DRAFT, its preview board and its data (if no other template shares it). Refused for a live template: unpublish or retire it instead.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateDiscardResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /dashboards/v3/templates/admin/{slug}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DashboardV3AdminDiscardImport",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Permanently removes a curated DRAFT, its preview board and its data (if no other template shares it). Refused for a live template: unpublish or retire it instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateDiscardResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_discard",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.edit",
        "command_path": "support template edit",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Edits a curated template's filing: changes holds title, description, use_case, function, industry (list) or sort_order; null clears a field. Optional base_version makes it conditional (409 when the row moved). notes says what changes for customers.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateEditResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /dashboards/v3/templates/admin/{slug}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminEditRow",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Edits a curated template's filing: changes holds title, description, use_case, function, industry (list) or sort_order; null clears a field. Optional base_version makes it conditional (409 when the row moved). notes says what changes for customers.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateEditResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_edit",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.export",
        "command_path": "support template export",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a curated template as a .zip template file (default <slug>.zip); with_data also packages a capped copy of its rows.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateExportResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/{slug}/export",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminExportBundle",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a curated template as a .zip template file (default <slug>.zip); with_data also packages a capped copy of its rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateExportResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_export",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.export-dashboard",
        "command_path": "support template export-dashboard",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a dashboard you can edit as a .zip template file; slug (required) is the id an import matches on; with_data (default true) packages a capped copy of its rows.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateExportDashboardResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/dashboards/{dashboard_id}/export",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminExportDashboard",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a dashboard you can edit as a .zip template file; slug (required) is the id an import matches on; with_data (default true) packages a capped copy of its rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateExportDashboardResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_export_dashboard",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.import",
        "command_path": "support template import",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Imports a template file as a curated DRAFT (not published); an existing slug is updated in place. dataset names the data to bind a file that carries none. Inspect it first.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateImportResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/templates/admin/import",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminImportBundle",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Imports a template file as a curated DRAFT (not published); an existing slug is updated in place. dataset names the data to bind a file that carries none. Inspect it first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateImportResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_import",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.inspect",
        "command_path": "support template inspect",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Reads a template file without importing it: what it needs, whether it carries data and a picture, and whether the catalog already has it. Writes nothing. The file comes from the local disk.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateInspectResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/templates/admin/inspect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminInspectBundle",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Reads a template file without importing it: what it needs, whether it carries data and a picture, and whether the catalog already has it. Writes nothing. The file comes from the local disk.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateInspectResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_inspect",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.list",
        "command_path": "support template list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every curated template, drafts and broken rows included, worst first, each with what is wrong and the action that fixes it.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateListResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminCatalog",
        "pagination_policy": "single_page",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every curated template, drafts and broken rows included, worst first, each with what is wrong and the action that fixes it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.publish",
        "command_path": "support template publish",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Takes a curated draft live in every customer's gallery. Refused, with nothing published, when the template fails on its own data.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplatePublishResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/templates/admin/{slug}/publish",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminPublish",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Takes a curated draft live in every customer's gallery. Refused, with nothing published, when the template fails on its own data.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplatePublishResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_publish",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.retire",
        "command_path": "support template retire",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Keeps the row but stops the catalog offering or auditing it; reversible with support template unpublish.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateRetireResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/templates/admin/{slug}/retire",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminRetire",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Keeps the row but stops the catalog offering or auditing it; reversible with support template unpublish.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateRetireResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_retire",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "support.template.snapshots",
        "command_path": "support template snapshots",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every stored dataset the template catalog holds (curated and saved templates), and the templates holding none.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTemplateSnapshotsResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /dashboards/v3/templates/admin/snapshots",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "DashboardV3AdminSnapshots",
        "pagination_policy": "single_page",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every stored dataset the template catalog holds (curated and saved templates), and the templates holding none.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateSnapshotsResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_snapshots",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.thumbnail.clear",
        "command_path": "support template thumbnail clear",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Removes a curated template's picture; its card falls back to the og-card.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateThumbnailClearResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /dashboards/v3/templates/admin/{slug}/thumbnail",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminDeleteThumbnail",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Removes a curated template's picture; its card falls back to the og-card.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateThumbnailClearResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_thumbnail_clear",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.thumbnail.set",
        "command_path": "support template thumbnail set",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Uploads or replaces a curated template's picture: PNG, JPEG or WebP read from its content, 1 MB at most.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateThumbnailSetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /dashboards/v3/templates/admin/{slug}/thumbnail",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminPutThumbnail",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Uploads or replaces a curated template's picture: PNG, JPEG or WebP read from its content, 1 MB at most.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateThumbnailSetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_thumbnail_set",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.template.unpublish",
        "command_path": "support template unpublish",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Returns a live or retired curated template to draft; the board, canvas and row survive.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportTemplateUnpublishResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /dashboards/v3/templates/admin/{slug}/unpublish",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DashboardV3AdminUnpublish",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Returns a live or retired curated template to draft; the board, canvas and row survive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateUnpublishResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.template_unpublish",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.triage",
        "command_path": "support triage",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportTriageResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/triage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportTriage",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTriageResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.triage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.usage-tiles",
        "command_path": "support usage-tiles",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportUsageTilesResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/usage-tiles",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportUsageTiles",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportUsageTilesResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.usage_tiles",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.user.list-all",
        "command_path": "support user list-all",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportUserListAllResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /settings/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListUsersOfWorkspaces",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportUserListAllResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.user_list_all",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.user.register",
        "command_path": "support user register",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Registers a new user account and may send them an invitation email. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportUserRegisterResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RegisterUser",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Registers a new user account and may send them an invitation email. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportUserRegisterResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.user_register",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.user.update",
        "command_path": "support user update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Changes another user's account details. Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportUserUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /support/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateUserVerification",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Changes another user's account details. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportUserUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.user_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.activity",
        "command_path": "support workspace activity",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceActivityResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/activity",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportWorkspaceActivity",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceActivityResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_activity",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "returns_job",
        "canonical_command": "support.workspace.archive",
        "command_path": "support workspace archive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "returns_job",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the workspace's data to cold storage and takes it offline. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the archive has finished. Needs `storage_class` (GLACIER_IR or DEEP_ARCHIVE) and `confirm_name`, the workspace's exact name (case sensitive). `cancel_billing` also cancels billing. Read `support workspace archive-info WORKSPACE_ID` first. Reverse it with `support workspace restore-archive WORKSPACE_ID`.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceArchiveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/archive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportWorkspaceArchive",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the workspace's data to cold storage and takes it offline. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the archive has finished. Needs `storage_class` (GLACIER_IR or DEEP_ARCHIVE) and `confirm_name`, the workspace's exact name (case sensitive). `cancel_billing` also cancels billing. Read `support workspace archive-info WORKSPACE_ID` first. Reverse it with `support workspace restore-archive WORKSPACE_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceArchiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_archive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.archive-info",
        "command_path": "support workspace archive-info",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceArchiveInfoResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/archive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportWorkspaceArchiveInfo",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceArchiveInfoResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_archive_info",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.chargebee-cancelled",
        "command_path": "support workspace chargebee-cancelled",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Records the workspace's Chargebee subscription as cancelled; use it only after the cancellation was done in Chargebee.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceChargebeeCancelledResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/chargebee-cancelled",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportWorkspaceChargebeeCancelled",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Records the workspace's Chargebee subscription as cancelled; use it only after the cancellation was done in Chargebee.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceChargebeeCancelledResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_chargebee_cancelled",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.create",
        "command_path": "support workspace create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Support staff only. Creates a workspace with its owner and plan (payment_frequency monthly or yearly). Needs --yes and --confirm TARGET.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateWorkspaces",
        "pagination_policy": "none",
        "preconditions": "Support staff only. Creates a workspace with its owner and plan (payment_frequency monthly or yearly). Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.deal-seed",
        "command_path": "support workspace deal-seed",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceDealSeedResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/deal-seed",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportWorkspaceDealSeed",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceDealSeedResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_deal_seed",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.delete",
        "command_path": "support workspace delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /support/workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteWorkspace",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.entitlement",
        "command_path": "support workspace entitlement",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceEntitlementResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/entitlement",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "SupportWorkspaceEntitlement",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceEntitlementResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_entitlement",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.get",
        "command_path": "support workspace get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceGetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaceDetail",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.invite.cancel",
        "command_path": "support workspace invite cancel",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the pending invite so its link stops working.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceInviteCancelResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /support/workspaces/{workspace_id}/users/invites/{invite_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportCancelWorkspaceInvite",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the pending invite so its link stops working.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceInviteCancelResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_invite_cancel",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.invite.resend",
        "command_path": "support workspace invite resend",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the invitee again at once.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceInviteResendResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/users/invites/{invite_id}/resend",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportResendWorkspaceInvite",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the invitee again at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceInviteResendResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_invite_resend",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.list",
        "command_path": "support workspace list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaces",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.project.list",
        "command_path": "support workspace project list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Tech admin only (Mammoth staff role); refused for every other user.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceProjectListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/projects",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListProjects",
        "pagination_policy": "none",
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceProjectListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_project_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.project.move-check",
        "command_path": "support workspace project move-check",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Pass the workspace the project is in and the project id as positionals and target_workspace_id in --input.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceProjectMoveCheckResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/projects/{project_id}/move",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "CheckProjectMove",
        "pagination_policy": "none",
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Pass the workspace the project is in and the project id as positionals and target_workspace_id in --input.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceProjectMoveCheckResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_check",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.project.move-start",
        "command_path": "support workspace project move-start",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Run `support workspace project move-check` first; acknowledged_warnings must hold the code of every warning. A project with an unfinished move resumes that move.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceProjectMoveStartResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/projects/{project_id}/move",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "StartProjectMove",
        "pagination_policy": "none",
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Run `support workspace project move-check` first; acknowledged_warnings must hold the code of every warning. A project with an unfinished move resumes that move.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceProjectMoveStartResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_start",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.restore-access",
        "command_path": "support workspace restore-access",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceRestoreAccessResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/restore-access",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RestoreWorkspaceAccess",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceRestoreAccessResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_restore_access",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "returns_job",
        "canonical_command": "support.workspace.restore-archive",
        "command_path": "support workspace restore-archive",
        "confirmation": "confirm_target",
        "contract": {
          "async": "returns_job",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Brings an archived workspace back from cold storage. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the restore has finished. Check `support workspace archive-info WORKSPACE_ID` first.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceRestoreArchiveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SupportWorkspaceArchiveRestore",
        "pagination_policy": "none",
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Brings an archived workspace back from cold storage. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the restore has finished. Check `support workspace archive-info WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceRestoreArchiveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_restore_archive",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.suspend-access",
        "command_path": "support workspace suspend-access",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceSuspendAccessResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/suspend-access",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "SuspendWorkspaceAccess",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceSuspendAccessResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_suspend_access",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.update",
        "command_path": "support workspace update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /support/workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateWorkspaceDetail",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.user.add",
        "command_path": "support workspace user add",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceUserAddResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /support/workspaces/{workspace_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "AddUserToWorkspace",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserAddResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_add",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.user.list",
        "command_path": "support workspace user list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: WORKSPACE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "SupportWorkspaceUserListResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /support/workspaces/{workspace_id}/users",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetUserList",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceUserListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.user.remove",
        "command_path": "support workspace user remove",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceUserRemoveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /support/workspaces/{workspace_id}/users/{user_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RemoveWorkspaceUser",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserRemoveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_remove",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "support.workspace.user.transfer",
        "command_path": "support workspace user transfer",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "SupportWorkspaceUserTransferResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /support/workspaces/{workspace_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "TransferUserRoles",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserTransferResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_transfer",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "template": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "template.create",
        "command_path": "template create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "TemplateCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/templates",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateTemplate",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.templates.TemplatesAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "template.delete",
        "command_path": "template delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "TemplateDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.templates.TemplatesAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "template.get",
        "command_path": "template get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "TemplateGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TemplateGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.templates.TemplatesAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "template.list",
        "command_path": "template list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "TemplateListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/templates",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListTemplates",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TemplateListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.templates.TemplatesAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "template.update",
        "command_path": "template update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "TemplateUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/templates/{template_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.templates.TemplatesAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "token": [
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "token.create",
        "command_path": "token create",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The token is shown once, in this response only; store it at once. It is redacted from logs and diagnostics. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ClientAppCreateResult",
          "scope": "profile",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "The token is shown once, in this response only; store it at once. It is redacted from logs and diagnostics. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ClientAppCreateResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "token.list",
        "command_path": "token list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Lists the workspace's API tokens.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ClientAppListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "offset",
        "preconditions": "Lists the workspace's API tokens.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppListResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "token.revoke",
        "command_path": "token revoke",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Revokes the token for good; anything using it stops working. Needs --yes and --confirm with the exact token key.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ClientAppDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Revokes the token for good; anything using it stops working. Needs --yes and --confirm with the exact token key.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ClientAppDeleteResult",
        "scope": "profile",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "trash": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "trash.add",
        "command_path": "trash add",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "TrashAddResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "BulkTrash",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TrashAddResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.trash.TrashAPI.add",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "trash.list",
        "command_path": "trash list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "TrashListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/trash",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListTrash",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TrashListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.trash.TrashAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "trash.restore",
        "command_path": "trash restore",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "TrashRestoreResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/trash/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "BulkRestore",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TrashRestoreResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.trash.TrashAPI.restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      }
    ],
    "user": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "user.avatar.delete",
        "command_path": "user avatar delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes the signed-in user's profile picture; upload it again to restore it. Needs a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "UserAvatarDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /self/avatar",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteAvatar",
        "pagination_policy": "none",
        "preconditions": "Removes the signed-in user's profile picture; upload it again to restore it. Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserAvatarDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.users.UsersAPI.avatar_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "always_wait",
        "canonical_command": "user.avatar.upload",
        "command_path": "user avatar upload",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "UserAvatarUploadResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /self/avatar",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UploadProfilePic",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserAvatarUploadResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.users.UsersAPI.avatar_upload",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "user.delete-account",
        "command_path": "user delete-account",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes the signed-in user's account for good. Pass validate_only to check what would be removed first. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "UserDeleteAccountResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /self",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteSelf",
        "pagination_policy": "none",
        "preconditions": "Deletes the signed-in user's account for good. Pass validate_only to check what would be removed first. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserDeleteAccountResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.users.UsersAPI.delete_account",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "user.get",
        "command_path": "user get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "UserGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /self",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUserDetails",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "UserGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "user.preference.get",
        "command_path": "user preference get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "UserPreferenceGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /preferences",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetUserPreferences",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "UserPreferenceGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.get_preferences",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "user.preference.update",
        "command_path": "user preference update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Body is the release {\"patch\": [{\"op\", \"path\", \"value\"}]} list; the CLI does not validate preference paths (observed key GLOBAL.PREFERENCES.TOP_TABS). Not verified live.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "UserPreferenceUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /preferences",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateUserPreferences",
        "pagination_policy": "none",
        "preconditions": "Body is the release {\"patch\": [{\"op\", \"path\", \"value\"}]} list; the CLI does not validate preference paths (observed key GLOBAL.PREFERENCES.TOP_TABS). Not verified live.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserPreferenceUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.update_preferences",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "user.update",
        "command_path": "user update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "UserUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /self",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateUser",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ],
    "view": [
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.active-user.list",
        "command_path": "view active-user list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewActiveUserListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/activities",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetActiveUsers",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewActiveUserListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.active_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.active-user.mark",
        "command_path": "view active-user mark",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewActiveUserMarkResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/activities",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "MarkActiveUser",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewActiveUserMarkResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.mark_active",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.ai.generate-data",
        "command_path": "view ai generate-data",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Preview operation per the pinned OpenAPI document; must not claim that it writes generated rows to the view. Rows accepted 1-100.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewAiGenerateDataResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/generate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "Preview",
        "pagination_policy": "none",
        "preconditions": "Preview operation per the pinned OpenAPI document; must not claim that it writes generated rows to the view. Rows accepted 1-100.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewAiGenerateDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.ai.AIAPI.generate_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.ai.generation-info",
        "command_path": "view ai generation-info",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewAiGenerationInfoResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/generate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetValidationInfo",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewAiGenerationInfoResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.ai.AIAPI.get_data_gen_info",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.ai.profile",
        "command_path": "view ai profile",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewAiProfileResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/profile_generation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "GenerateProfile",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewAiProfileResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.ai.AIAPI.generate_profile",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.analyze",
        "command_path": "view analyze",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Lists pipeline steps that can be dropped or moved without changing the result: findings of {rule, seqs, detail, proposed_order, safe}. Rules: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter. Only a safe finding is applied by view optimize. Also returns the view (name, dataset, rows, columns, state) and its pipeline step count, so no view get or task list follows. VIEW_ID may be several ids joined by commas: one result with an analysis per id, and an entry in errors for an id that failed.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewAnalyzeResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/analysis",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAnalysis",
        "pagination_policy": "none",
        "preconditions": "Read-only. Lists pipeline steps that can be dropped or moved without changing the result: findings of {rule, seqs, detail, proposed_order, safe}. Rules: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter. Only a safe finding is applied by view optimize. Also returns the view (name, dataset, rows, columns, state) and its pipeline step count, so no view get or task list follows. VIEW_ID may be several ids joined by commas: one result with an analysis per id, and an entry in errors for an id that failed.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewAnalyzeResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.analysis",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.bulk-delete",
        "command_path": "view bulk-delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATASET_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewBulkDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteMultipleDataviews",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewBulkDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.bulk_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.checkpoint.create",
        "command_path": "view checkpoint create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewCheckpointCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddCheckpoint",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.checkpoint.delete",
        "command_path": "view checkpoint delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewCheckpointDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteCheckpoint",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.checkpoint.get",
        "command_path": "view checkpoint get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewCheckpointGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineCheckpoint",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCheckpointGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.checkpoint.list",
        "command_path": "view checkpoint list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewCheckpointListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineCheckpoints",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCheckpointListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.checkpoint.update",
        "command_path": "view checkpoint update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewCheckpointUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditPatches",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.column.format.set",
        "command_path": "view column format set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A view display setting (the web grid's column format menu), not a pipeline task: it changes how values show, not the stored values, and adds no task. Date columns take date_format (python style, %d-%b-%Y) or postgres_date_format (DD-Mon-YYYY); numeric columns take decimal_spec (decimal places), currency_symbol, is_percentage, thousands_separator, decimal_separator. Keys given replace the same keys of the column's format; the rest are kept. To change how TEXT is read as a date, use view transform convert-type.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewColumnFormatSetResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "A view display setting (the web grid's column format menu), not a pipeline task: it changes how values show, not the stored values, and adds no task. Date columns take date_format (python style, %d-%b-%Y) or postgres_date_format (DD-Mon-YYYY); numeric columns take decimal_spec (decimal places), currency_symbol, is_percentage, thousands_separator, decimal_separator. Keys given replace the same keys of the column's format; the rest are kept. To change how TEXT is read as a date, use view transform convert-type.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewColumnFormatSetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.compare",
        "command_path": "view compare",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Pass pairs in --input as [[view_a, view_b], ...] (1 to 20 pairs). Each result has status ok, not_ready (a view's latest data is not built; see problem_views) or not_comparable (a view has duplicate column names), then rows_a, rows_b, columns_only_in_a, columns_only_in_b, checksum_a, checksum_b, equal and mismatched_columns. Columns match by display name; floats are rounded to 6 places.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewCompareResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/dataviews/compare",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "CompareDataviews",
        "pagination_policy": "none",
        "preconditions": "Read-only. Pass pairs in --input as [[view_a, view_b], ...] (1 to 20 pairs). Each result has status ok, not_ready (a view's latest data is not built; see problem_views) or not_comparable (a view has duplicate column names), then rows_a, rows_b, columns_only_in_a, columns_only_in_b, checksum_a, checksum_b, equal and mismatched_columns. Columns match by display name; floats are rounded to 6 places.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCompareResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.compare",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.conditional-format.create",
        "command_path": "view conditional-format create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "columns + operator + value + color colour each cell by its own value: one RULE per column, created in this one call (applies_to columns, the default). applies_to row makes one rule over any/all (match) of the columns. A raw rule body ({\"cf_type\": \"RULE\"|\"COLOR_SCALE\", \"payload\": {...}}) still works instead; applies_to must be row or columns.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewConditionalFormatCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateConditionalFormat",
        "pagination_policy": "none",
        "preconditions": "columns + operator + value + color colour each cell by its own value: one RULE per column, created in this one call (applies_to columns, the default). applies_to row makes one rule over any/all (match) of the columns. A raw rule body ({\"cf_type\": \"RULE\"|\"COLOR_SCALE\", \"payload\": {...}}) still works instead; applies_to must be row or columns.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.conditional-format.delete-all",
        "command_path": "view conditional-format delete-all",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact phrase DELETE ALL CONDITIONAL FORMATS required.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewConditionalFormatDeleteAllResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteConditionalFormat",
        "pagination_policy": "none",
        "preconditions": "Exact phrase DELETE ALL CONDITIONAL FORMATS required.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatDeleteAllResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.conditional-format.list",
        "command_path": "view conditional-format list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewConditionalFormatListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetConditionalFormat",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewConditionalFormatListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.conditional-format.replace",
        "command_path": "view conditional-format replace",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Same input as view conditional-format create (typed fields or a raw rule). Deletes every existing rule of the view, then creates the new ones, in one call; a refused rule leaves the rules created so far and the error names deleted_rule_ids and created_rule_ids. To add a rule beside the others use create.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewConditionalFormatReplaceResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Same input as view conditional-format create (typed fields or a raw rule). Deletes every existing rule of the view, then creates the new ones, in one call; a refused rule leaves the rules created so far and the error names deleted_rule_ids and created_rule_ids. To add a rule beside the others use create.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewConditionalFormatReplaceResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.conditional-format.update",
        "command_path": "view conditional-format update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]; reserved, not registered.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewConditionalFormatUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateConditionalFormat",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.create",
        "command_path": "view create",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "To work on a dataset's changes without touching its own views, create a working view; clone_from (a view id of the same dataset) carries that view's steps. A dataset's own view is the default_view of view list, never the newest or an agent-made view: read it, or clone it with clone_from when steps are needed; edit it in place only when asked to change that view.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddDataview",
        "pagination_policy": "none",
        "preconditions": "To work on a dataset's changes without touching its own views, create a working view; clone_from (a view id of the same dataset) carries that view's steps. A dataset's own view is the default_view of view list, never the newest or an agent-made view: read it, or clone it with clone_from when steps are needed; edit it in place only when asked to change that view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.client.ViewsResource.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "view.data.aggregate",
        "command_path": "view data aggregate",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only: computes and returns an aggregated result without adding a task to the view's pipeline or otherwise changing it. Pass exactly one of 'aggregations' (a PIVOT group-by; 'group_by' is optional) or 'metric' (a single METRIC value). 'function' is one of SUM, COUNT, AVG, MIN, MAX, STDDEV, DISTINCT_COUNT. A group_by item is a column name, or {\"column\": C, \"truncate\": DAY|WEEK|MONTH|QUARTER|YEAR} to bucket a DATE (a trend over time), or {\"column\": C, \"resolution\": N} to bucket a NUMERIC; grouping by a raw date gives one row per day. A metric is a number: only COUNT and DISTINCT_COUNT work on a DATE or TEXT column. For one column's trend, top values or spread, view data explore is the shorter call. order_by (result labels; a string like 'Total desc' or {column, direction}) with top ranks the groups on the backend; a limit without order_by keeps arbitrary rows and the result says ordered false. A group_by truncate on a TEXT column of dates is bucketed by the CLI: the stored format is detected from the data and stated in text_dates, an ambiguous day/month order (settle it with text_date_format) or an unreadable value fails loud, and a range condition (GT, GTE, LT, LTE, IN_RANGE with a YYYY-MM-DD value) on such a column works the same way. A truncate on a NUMERIC column, or a resolution on a non-NUMERIC one, is refused. To group by the part of a date, give {\"column\": C, \"part\": weekday|day|month|quarter|year} on a DATE or TEXT-date column: the groups are named (Monday, January, Q1) and in calendar order. This is the read-only way to answer by-weekday and by-month questions. An empty result carries observed_range: the min and max of the filtered or date column.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataAggregateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/query",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ExecuteVolatileQuery",
        "pagination_policy": "none",
        "preconditions": "Read-only: computes and returns an aggregated result without adding a task to the view's pipeline or otherwise changing it. Pass exactly one of 'aggregations' (a PIVOT group-by; 'group_by' is optional) or 'metric' (a single METRIC value). 'function' is one of SUM, COUNT, AVG, MIN, MAX, STDDEV, DISTINCT_COUNT. A group_by item is a column name, or {\"column\": C, \"truncate\": DAY|WEEK|MONTH|QUARTER|YEAR} to bucket a DATE (a trend over time), or {\"column\": C, \"resolution\": N} to bucket a NUMERIC; grouping by a raw date gives one row per day. A metric is a number: only COUNT and DISTINCT_COUNT work on a DATE or TEXT column. For one column's trend, top values or spread, view data explore is the shorter call. order_by (result labels; a string like 'Total desc' or {column, direction}) with top ranks the groups on the backend; a limit without order_by keeps arbitrary rows and the result says ordered false. A group_by truncate on a TEXT column of dates is bucketed by the CLI: the stored format is detected from the data and stated in text_dates, an ambiguous day/month order (settle it with text_date_format) or an unreadable value fails loud, and a range condition (GT, GTE, LT, LTE, IN_RANGE with a YYYY-MM-DD value) on such a column works the same way. A truncate on a NUMERIC column, or a resolution on a non-NUMERIC one, is refused. To group by the part of a date, give {\"column\": C, \"part\": weekday|day|month|quarter|year} on a DATE or TEXT-date column: the groups are named (Monday, January, Q1) and in calendar order. This is the read-only way to answer by-weekday and by-month questions. An empty result carries observed_range: the min and max of the filtered or date column.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataAggregateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.aggregate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.data.compare",
        "command_path": "view data compare",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Every number reported to the user comes from a tool result: use this to compare the same PIVOT/METRIC aggregate across two views (e.g. two platforms' totals per campaign) instead of subtracting two 'view data aggregate' reads by hand -- calc is the tool for a single expression. Takes the exact same --input shape as view data aggregate (aggregations/group_by, or metric); rows are joined on the group-by key (or compared as a single row for a bare metric) using exact Decimal arithmetic. A key present in only one view's result is not an error: 'only_in_first' and 'only_in_second' give its exact count and the first 25 rows, and 'rows' holds the keys both views have.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataCompareResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Every number reported to the user comes from a tool result: use this to compare the same PIVOT/METRIC aggregate across two views (e.g. two platforms' totals per campaign) instead of subtracting two 'view data aggregate' reads by hand -- calc is the tool for a single expression. Takes the exact same --input shape as view data aggregate (aggregations/group_by, or metric); rows are joined on the group-by key (or compared as a single row for a bare metric) using exact Decimal arithmetic. A key present in only one view's result is not an error: 'only_in_first' and 'only_in_second' give its exact count and the first 25 rows, and 'rows' holds the keys both views have.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCompareResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.data.drivers",
        "command_path": "view data drivers",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Use this, not a series of view data aggregate reads, for \"why did X drop/rise\", \"what drove the change between July and August\", \"explain the decline\": one call returns the total for each period, the change and its percentage, whether it came from volume (the row count) or value (value per row), and per 'by' column the groups that moved most with their signed share_of_change. --input: \"measure\" {\"column\", \"function\": SUM or COUNT}; \"date_column\"; \"compare\" [A, B], each 'YYYY-MM', 'YYYY-Qn', 'YYYY' or {\"from\": \"YYYY-MM-DD\", \"to\": \"YYYY-MM-DD\"} (the change is read from A to B; any other form is refused); \"by\" 1 to 3 columns; optional \"conditions\" in view data aggregate's condition shape. partial_period names a period the data does not cover to its end (or from its start): say it is incomplete, never compare it as a whole period. Answer with the total change first, then the top contributors with their share, then volume vs value. Amounts carry the currency in 'currency'; when it is null give plain numbers and never invent a currency.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataDriversResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only. Use this, not a series of view data aggregate reads, for \"why did X drop/rise\", \"what drove the change between July and August\", \"explain the decline\": one call returns the total for each period, the change and its percentage, whether it came from volume (the row count) or value (value per row), and per 'by' column the groups that moved most with their signed share_of_change. --input: \"measure\" {\"column\", \"function\": SUM or COUNT}; \"date_column\"; \"compare\" [A, B], each 'YYYY-MM', 'YYYY-Qn', 'YYYY' or {\"from\": \"YYYY-MM-DD\", \"to\": \"YYYY-MM-DD\"} (the change is read from A to B; any other form is refused); \"by\" 1 to 3 columns; optional \"conditions\" in view data aggregate's condition shape. partial_period names a period the data does not cover to its end (or from its start): say it is incomplete, never compare it as a whole period. Answer with the total change first, then the top contributors with their share, then volume vs value. Amounts carry the currency in 'currency'; when it is null give plain numbers and never invent a currency.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataDriversResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.data.explore",
        "command_path": "view data explore",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only: reads one column's value distribution -- trend, distribution, histogram, or top values. It does not open or change any card in the UI; to open Explore cards use 'view explore-panel set'. It reads without adding a task to the view's pipeline (never use 'view transform pivot' just to explore). DATE column: counts per 'level' bucket (AUTO default; SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR, DECADE, CENTURY, MILLENNIUM) for \"what's trending\", \"over time\", \"by month\", \"by year\". NUMERIC column: counts per 'level' resolution (AUTO default; a power of 10) for a distribution or histogram. TEXT column: top values by count, 'limit' default 20 -- \"what's in this column\". Every bucket has 'count' and 'percentage' of the total. 'row_count' is the number of unique values (buckets). Options (--input): 'metric' {\"column\",\"function\"} adds a per-bucket SUM, COUNT, AVG, MIN, MAX, STDDEV or DISTINCT_COUNT over another column (the custom card); 'condition' filters rows first -- include/exclude values, blanks, a date or number range, text contains -- and several cards' selections combine as one AND condition (cross-filter); drill down by re-running at a finer 'level' with a 'condition' on the chosen bucket's range; 'percentage_of' \"metric\" makes 'percentage' the share of the 'metric' total (default: of the count); 'sort' count_desc, count_asc, value_asc, value_desc, metric_desc or metric_asc (blanks last; the card puts them first); 'limit' and 'offset' page the buckets (\"load more\"); 'range' true adds the exact earliest and latest value of a DATE or NUMERIC column under the same condition; '-o csv' prints the buckets as CSV; 'sequence' explores at a pipeline step. To exclude a value the way the card does (blank rows stay), use or(NE value, IS_EMPTY on that column): a plain NE, NOT_IN_LIST or not drops blank rows. To put the card on a dashboard, say it in words: 'dashboard chat edit DASHBOARD_ID' (prompt) or 'dashboard v3 generate'. Search several columns for text: or of CONTAINS per text column. Replace all values like this: 'view transform replace'. Related: distinct raw values of a DATE/NUMERIC column, a summary (min/max/sum/avg) or a matching-row count -> 'view data aggregate'; keep the filter as a pipeline step -> 'view transform filter'; save it as a new view -> 'view create' then 'view transform filter' on it; download all rows -> 'view export csv'. A TEXT column of dates takes a level (or column_type DATE): the format is detected from the data and stated in text_dates; ambiguous or unreadable dates fail loud. A column_type that disagrees with the stored type is refused, never dropped. Example: --input '{\"level\": \"MONTH\", \"condition\": {\"column\": \"Results\", \"operator\": \"EQ\", \"value\": \"Fail\"}}'. A figure for a period (year, quarter, month) is one explore of the DATE column with level YEAR, QUARTER or MONTH and a metric {\"column\": AMOUNT, \"function\": \"SUM\"}: it returns one figure per period and the date range the data covers, so no rows need paging. cumulative true adds a running total; keep one year or range with condition, for a year {\"column\": DATE_COLUMN, \"operator\": \"=\", \"value\": 2017, \"component\": \"year\"}. Figures come back rounded to two decimals: quote them as returned.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataExploreResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only: reads one column's value distribution -- trend, distribution, histogram, or top values. It does not open or change any card in the UI; to open Explore cards use 'view explore-panel set'. It reads without adding a task to the view's pipeline (never use 'view transform pivot' just to explore). DATE column: counts per 'level' bucket (AUTO default; SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR, DECADE, CENTURY, MILLENNIUM) for \"what's trending\", \"over time\", \"by month\", \"by year\". NUMERIC column: counts per 'level' resolution (AUTO default; a power of 10) for a distribution or histogram. TEXT column: top values by count, 'limit' default 20 -- \"what's in this column\". Every bucket has 'count' and 'percentage' of the total. 'row_count' is the number of unique values (buckets). Options (--input): 'metric' {\"column\",\"function\"} adds a per-bucket SUM, COUNT, AVG, MIN, MAX, STDDEV or DISTINCT_COUNT over another column (the custom card); 'condition' filters rows first -- include/exclude values, blanks, a date or number range, text contains -- and several cards' selections combine as one AND condition (cross-filter); drill down by re-running at a finer 'level' with a 'condition' on the chosen bucket's range; 'percentage_of' \"metric\" makes 'percentage' the share of the 'metric' total (default: of the count); 'sort' count_desc, count_asc, value_asc, value_desc, metric_desc or metric_asc (blanks last; the card puts them first); 'limit' and 'offset' page the buckets (\"load more\"); 'range' true adds the exact earliest and latest value of a DATE or NUMERIC column under the same condition; '-o csv' prints the buckets as CSV; 'sequence' explores at a pipeline step. To exclude a value the way the card does (blank rows stay), use or(NE value, IS_EMPTY on that column): a plain NE, NOT_IN_LIST or not drops blank rows. To put the card on a dashboard, say it in words: 'dashboard chat edit DASHBOARD_ID' (prompt) or 'dashboard v3 generate'. Search several columns for text: or of CONTAINS per text column. Replace all values like this: 'view transform replace'. Related: distinct raw values of a DATE/NUMERIC column, a summary (min/max/sum/avg) or a matching-row count -> 'view data aggregate'; keep the filter as a pipeline step -> 'view transform filter'; save it as a new view -> 'view create' then 'view transform filter' on it; download all rows -> 'view export csv'. A TEXT column of dates takes a level (or column_type DATE): the format is detected from the data and stated in text_dates; ambiguous or unreadable dates fail loud. A column_type that disagrees with the stored type is refused, never dropped. Example: --input '{\"level\": \"MONTH\", \"condition\": {\"column\": \"Results\", \"operator\": \"EQ\", \"value\": \"Fail\"}}'. A figure for a period (year, quarter, month) is one explore of the DATE column with level YEAR, QUARTER or MONTH and a metric {\"column\": AMOUNT, \"function\": \"SUM\"}: it returns one figure per period and the date range the data covers, so no rows need paging. cumulative true adds a running total; keep one year or range with condition, for a year {\"column\": DATE_COLUMN, \"operator\": \"=\", \"value\": 2017, \"component\": \"year\"}. Figures come back rounded to two decimals: quote them as returned.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataExploreResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.data.forecast",
        "command_path": "view data forecast",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Use this for \"forecast\", \"projection\", \"estimate next month\", \"what will revenue be in October\": never divide a partial period by its days or extend a trend by hand. --input: \"measure\" {\"column\", \"function\"} as view data aggregate takes; \"date_column\"; \"unit\" month (default), quarter or week; \"periods\" 1 to 12 (default 1); optional \"conditions\" in view data aggregate's condition shape. It reads the measure per period in one aggregate and fits an ordinary least-squares linear trend to the complete periods, adding a seasonal index only with two full cycles (24 months, 8 quarters, 104 weeks; otherwise seasonal is false), with a t-based 95% prediction interval (low, high). A last period the data does not cover to its end is left out of the fit and reported as excluded_partial (its value so far and data_through); it is the first period forecast. The forecast starts after the last period in the data: when the data ends in mid-September and the user asks for October, pass periods 2 and quote October. Fewer than 3 complete periods is refused. Give the estimate with its range, name the method, never present it as certain; amounts carry the currency in 'currency', and when it is null give plain numbers and never invent a currency.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataForecastResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only. Use this for \"forecast\", \"projection\", \"estimate next month\", \"what will revenue be in October\": never divide a partial period by its days or extend a trend by hand. --input: \"measure\" {\"column\", \"function\"} as view data aggregate takes; \"date_column\"; \"unit\" month (default), quarter or week; \"periods\" 1 to 12 (default 1); optional \"conditions\" in view data aggregate's condition shape. It reads the measure per period in one aggregate and fits an ordinary least-squares linear trend to the complete periods, adding a seasonal index only with two full cycles (24 months, 8 quarters, 104 weeks; otherwise seasonal is false), with a t-based 95% prediction interval (low, high). A last period the data does not cover to its end is left out of the fit and reported as excluded_partial (its value so far and data_through); it is the first period forecast. The forecast starts after the last period in the data: when the data ends in mid-September and the user asks for October, pass periods 2 and quote October. Fewer than 3 complete periods is refused. Give the estimate with its range, name the method, never present it as certain; amounts carry the currency in 'currency', and when it is null give plain numbers and never invent a currency.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataForecastResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "view.data.get",
        "command_path": "view data get",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDataviewData",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.get_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.data.profile",
        "command_path": "view data profile",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only profile of the WHOLE view (every row, not a page of 50): per column the blank count, distinct count, min and max (NUMERIC and DATE) and top values; a \"summary\" of constant, all-blank and mostly-blank columns; \"spelling_variants\" per TEXT column -- spellings of one value that differ by case, punctuation or legal form (Ltd = Limited, Inc = Incorporated ...) -- with a ready \"bulk_replace\" input and the full \"command\" to merge them. Use it to explore, understand or profile a dataset, find blanks, duplicates and dirty categories. Blanks, distinct counts and min/max come from the stats the backend stored for the view when their row count equals the view row count now; otherwise (stale after a pipeline step, or none stored) they are queried in a few multi-column pivots. The \"sources\" block says which, and that the backend records no as-of time; each column \"from\" says stored or query. Top values, spelling variants and the target comparison are always queried. --input: \"target\" (a column with 2-20 values, e.g. churn) adds the target distribution (positive_rate of its rarest class) and \"association\": \"categorical\" columns ranked by cramers_v (one grouped count per column) and \"numeric\" columns ranked by standardized_difference (two multi-column pivots) -- the churn drivers; \"columns\" (names) profiles only those; \"top\" values per column (default 5); \"limit\" columns shown in detail (default 50; the summary always covers all). A column with more than 5000 distinct values gets counts and min/max but no value list. Example: --input '{\"target\": \"CHURN\", \"limit\": 20}'.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataProfileResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only profile of the WHOLE view (every row, not a page of 50): per column the blank count, distinct count, min and max (NUMERIC and DATE) and top values; a \"summary\" of constant, all-blank and mostly-blank columns; \"spelling_variants\" per TEXT column -- spellings of one value that differ by case, punctuation or legal form (Ltd = Limited, Inc = Incorporated ...) -- with a ready \"bulk_replace\" input and the full \"command\" to merge them. Use it to explore, understand or profile a dataset, find blanks, duplicates and dirty categories. Blanks, distinct counts and min/max come from the stats the backend stored for the view when their row count equals the view row count now; otherwise (stale after a pipeline step, or none stored) they are queried in a few multi-column pivots. The \"sources\" block says which, and that the backend records no as-of time; each column \"from\" says stored or query. Top values, spelling variants and the target comparison are always queried. --input: \"target\" (a column with 2-20 values, e.g. churn) adds the target distribution (positive_rate of its rarest class) and \"association\": \"categorical\" columns ranked by cramers_v (one grouped count per column) and \"numeric\" columns ranked by standardized_difference (two multi-column pivots) -- the churn drivers; \"columns\" (names) profiles only those; \"top\" values per column (default 5); \"limit\" columns shown in detail (default 50; the summary always covers all). A column with more than 5000 distinct values gets counts and min/max but no value list. Example: --input '{\"target\": \"CHURN\", \"limit\": 20}'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataProfileResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "view.data.query",
        "command_path": "view data query",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "B11 QUERY_OFFSET_SEMANTICS: one-indexed (offset=1) with no proven continuation; --all is blocked.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataQueryResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetDataviewDataPost",
        "pagination_policy": "offset",
        "preconditions": "B11 QUERY_OFFSET_SEMANTICS: one-indexed (offset=1) with no proven continuation; --all is blocked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataQueryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.query_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.data-check.create",
        "command_path": "view data-check create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "body needs a placement: pinned_to_end true or a task_sequence (4GENR007 \"Either task_sequence or pinned_to_end must be set\" otherwise). An alert the user asks for (\"tell me when late deliveries go above 10\") is a data check: pinned_to_end true, fail_behavior \"flag_and_continue\" (the default \"halt\" stops the pipeline), and one row_count check with condition \"lte\" and value 10 whose config condition_sql filters the rows to count, e.g. \"\\\"Status\\\" = 'Late'\" (column display names). It is re-tested after every pipeline run and source refresh, and its owner gets an in-app notice when it starts failing (once, not on every failing run). Say it fires when the count goes above the value, not below.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDataCheckCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddDataCheck",
        "pagination_policy": "none",
        "preconditions": "body needs a placement: pinned_to_end true or a task_sequence (4GENR007 \"Either task_sequence or pinned_to_end must be set\" otherwise). An alert the user asks for (\"tell me when late deliveries go above 10\") is a data check: pinned_to_end true, fail_behavior \"flag_and_continue\" (the default \"halt\" stops the pipeline), and one row_count check with condition \"lte\" and value 10 whose config condition_sql filters the rows to count, e.g. \"\\\"Status\\\" = 'Late'\" (column display names). It is re-tested after every pipeline run and source refresh, and its owner gets an in-app notice when it starts failing (once, not on every failing run). Say it fires when the count goes above the value, not below.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.data-check.delete",
        "command_path": "view data-check delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDataCheckDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDataCheck",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.data-check.get",
        "command_path": "view data-check get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataCheckGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineDataCheck",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCheckGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.data-check.list",
        "command_path": "view data-check list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDataCheckListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineDataChecks",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCheckListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.data-check.update",
        "command_path": "view data-check update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}, the same body the web app sends. On release the PATCH returns HTTP 500 (outcome_unknown) from backend validation that runs after the change is committed; read the check back with view data-check get before retrying.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDataCheckUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditDatacheck",
        "pagination_policy": "none",
        "preconditions": "patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}, the same body the web app sends. On release the PATCH returns HTTP 500 (outcome_unknown) from backend validation that runs after the change is committed; read the check back with view data-check get before retrying.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.delete",
        "command_path": "view delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Immutable view-ID confirmation. Supplying dataset_id uses the exact nested endpoint and skips parent discovery; omitting it retains legacy parent discovery.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDataview",
        "pagination_policy": "none",
        "preconditions": "Immutable view-ID confirmation. Supplying dataset_id uses the exact nested endpoint and skips parent discovery; omitting it retains legacy parent discovery.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.client.ViewsResource.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.derivative.create",
        "command_path": "view derivative create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "ARGUMENT and any column reference in the METRIC expression are internal names (metadata[].internal_name from view get, e.g. column_1), not display names; a display name makes the backend fail with HTTP 500. The result is {\"id\": N, \"card\": bool}; read the value with view derivative data. A METRIC shows as an explore-panel card only through display_properties; when it is absent or null the CLI defaults it to the metric card (type metric, info.title = the AS name); pass display_properties to override. card says whether a card exists (verify.card mirrors it).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDerivativeCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateDerivative",
        "pagination_policy": "none",
        "preconditions": "ARGUMENT and any column reference in the METRIC expression are internal names (metadata[].internal_name from view get, e.g. column_1), not display names; a display name makes the backend fail with HTTP 500. The result is {\"id\": N, \"card\": bool}; read the value with view derivative data. A METRIC shows as an explore-panel card only through display_properties; when it is absent or null the CLI defaults it to the metric card (type metric, info.title = the AS name); pass display_properties to override. card says whether a card exists (verify.card mirrors it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.derivative.data",
        "command_path": "view derivative data",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "body is {\"condition\": CONDITION_OR_NULL, \"limit\": null}, the same document the web app posts; {\"limit\": null} is the minimal accepted body and an empty body is rejected (4GENR007). Returns STATUS, the metric row(s) under data and their metadata.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDerivativeDataResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}/data",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "FetchDerivativeData",
        "pagination_policy": "none",
        "preconditions": "body is {\"condition\": CONDITION_OR_NULL, \"limit\": null}, the same document the web app posts; {\"limit\": null} is the minimal accepted body and an empty body is rejected (4GENR007). Returns STATUS, the metric row(s) under data and their metadata.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeDataResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.derivative.delete",
        "command_path": "view derivative delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDerivativeDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteDerivative",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.derivative.list",
        "command_path": "view derivative list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDerivativeListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListDerivatives",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDerivativeListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.derivative.update",
        "command_path": "view derivative update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDerivativeUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditDerivative",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.draft.auto-run",
        "command_path": "view draft auto-run",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires exactly one of --enabled/--disabled, no implicit default.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewDraftAutoRunResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Requires exactly one of --enabled/--disabled, no implicit default.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftAutoRunResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.draft.command",
        "command_path": "view draft command",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewDraftCommandResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/draft-mode",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ExecutePipelineDraftCommand",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDraftCommandResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.command",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.draft.discard",
        "command_path": "view draft discard",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "always_wait",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prompt or --yes because queued tasks are deleted.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewDraftDiscardResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Prompt or --yes because queued tasks are deleted.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftDiscardResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.draft.enter",
        "command_path": "view draft enter",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Idempotent only when server state proves it is already active.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewDraftEnterResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Idempotent only when server state proves it is already active.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftEnterResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.draft.status",
        "command_path": "view draft status",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Server-backed draft-status seam used by 'view draft status'.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewDraftStatusResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Server-backed draft-status seam used by 'view draft status'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDraftStatusResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.draft.submit",
        "command_path": "view draft submit",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires server draft state before mutation.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewDraftSubmitResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Requires server draft state before mutation.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftSubmitResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.explore-panel.add-to-dashboard",
        "command_path": "view explore-panel add-to-dashboard",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Puts one open Explore card on a dashboard as a figure, like the card menu's Add to dashboard. Input {\"card\": COLUMN NAME} and either \"dashboard_id\" (an existing board of this view) or \"new_dashboard_title\" (a new blank board; a title the project already has is refused); \"page\": {\"id\": N} or {\"new_title\": \"...\"} goes with dashboard_id. The card becomes the figure the web app makes: a text list a top 10 bar (donut top 7, treemap top 24), a date a bar or line by year or month, a number a bar over fixed ranges. The result carries the figure, \"notes\" (what does not carry over: top N, date unit, fixed ranges, filters left off), dashboard_id and created_dashboard. A filter card (search, scatter, ask), a card whose column is gone and a card with a value the dashboard cannot show are refused with the web app's reason. Wait for the bake with job wait.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExplorePanelAddToDashboardResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Puts one open Explore card on a dashboard as a figure, like the card menu's Add to dashboard. Input {\"card\": COLUMN NAME} and either \"dashboard_id\" (an existing board of this view) or \"new_dashboard_title\" (a new blank board; a title the project already has is refused); \"page\": {\"id\": N} or {\"new_title\": \"...\"} goes with dashboard_id. The card becomes the figure the web app makes: a text list a top 10 bar (donut top 7, treemap top 24), a date a bar or line by year or month, a number a bar over fixed ranges. The result carries the figure, \"notes\" (what does not carry over: top N, date unit, fixed ranges, filters left off), dashboard_id and created_dashboard. A filter card (search, scatter, ask), a card whose column is gone and a card with a value the dashboard cannot show are refused with the web app's reason. Wait for the bake with job wait.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelAddToDashboardResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.explore-panel.edit",
        "command_path": "view explore-panel edit",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes the Explore cards the way the card menus do, with display names and no card JSON, and writes the panel once. The card must be open (view explore-panel set). Input {\"edits\": [...]}, applied in order; each edit is {\"op\", \"card\": COLUMN NAME, ...}. metric: {\"agg\": COUNT} or {\"agg\": SUM|AVG|MIN|MAX|STDDEV|DISTINCT_COUNT, \"of\": NUMERIC COLUMN} (DISTINCT_COUNT takes any column). sort: {\"by\": metric|value, \"direction\": ASC|DESC}, list views only. view: {\"view\": list|columns|timeline|donut|treemap}, which depends on the column type. level: {\"level\": a date level or a number bucket width}. filter / exclude: {\"values\": [...]} for text, {\"from\", \"to\"} for ranges, {\"blanks\": true} for blanks; clear: the filter off; remove: the card off. Query cards: {\"op\": \"search\", \"text\": \"...\", \"columns\": [...]}, {\"op\": \"scatter\", \"x\": NUMERIC, \"y\": NUMERIC, \"box\": {...}} and {\"op\": \"ask\", \"question\": \"...\"} (the question goes to the same suggestions call the web app makes and its condition is kept). An unknown column, a column of the wrong type or a value outside the web app's options is refused with the valid choices. The result carries \"panel\", the panel read back. It is a per-user preference: it does not change the view or what other users see.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExplorePanelEditResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Changes the Explore cards the way the card menus do, with display names and no card JSON, and writes the panel once. The card must be open (view explore-panel set). Input {\"edits\": [...]}, applied in order; each edit is {\"op\", \"card\": COLUMN NAME, ...}. metric: {\"agg\": COUNT} or {\"agg\": SUM|AVG|MIN|MAX|STDDEV|DISTINCT_COUNT, \"of\": NUMERIC COLUMN} (DISTINCT_COUNT takes any column). sort: {\"by\": metric|value, \"direction\": ASC|DESC}, list views only. view: {\"view\": list|columns|timeline|donut|treemap}, which depends on the column type. level: {\"level\": a date level or a number bucket width}. filter / exclude: {\"values\": [...]} for text, {\"from\", \"to\"} for ranges, {\"blanks\": true} for blanks; clear: the filter off; remove: the card off. Query cards: {\"op\": \"search\", \"text\": \"...\", \"columns\": [...]}, {\"op\": \"scatter\", \"x\": NUMERIC, \"y\": NUMERIC, \"box\": {...}} and {\"op\": \"ask\", \"question\": \"...\"} (the question goes to the same suggestions call the web app makes and its condition is kept). An unknown column, a column of the wrong type or a value outside the web app's options is refused with the valid choices. The result carries \"panel\", the panel read back. It is a per-user preference: it does not change the view or what other users see.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelEditResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "view.explore-panel.export-image",
        "command_path": "view explore-panel export-image",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes the open Explore card \"card\" (its column display name) as an SVG file at \"output_path\" (default explore-card-VIEW_ID.svg). The backend has no rasterizer, so this writes SVG only; the web app's PNG is a browser screenshot. A bar card becomes a bar chart (one bar per group, its value the card's metric); a list card becomes a table of its rows. The rows are read as view data explore reads them, so the list is the top values the backend returns (TEXT: 20). \"style_id\" optionally renders with a saved style. The card must be open (view explore-panel set). Not available inside the Mammoth app: it writes a file on the host. It is a per-user preference read; it does not change the view or the panel.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExplorePanelExportImageResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /dashboards/v3/render/svg",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "RenderFigureSvg",
        "pagination_policy": "none",
        "preconditions": "Writes the open Explore card \"card\" (its column display name) as an SVG file at \"output_path\" (default explore-card-VIEW_ID.svg). The backend has no rasterizer, so this writes SVG only; the web app's PNG is a browser screenshot. A bar card becomes a bar chart (one bar per group, its value the card's metric); a list card becomes a table of its rows. The rows are read as view data explore reads them, so the list is the top values the backend returns (TEXT: 20). \"style_id\" optionally renders with a saved style. The card must be open (view explore-panel set). Not available inside the Mammoth app: it writes a file on the host. It is a per-user preference read; it does not change the view or the panel.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExplorePanelExportImageResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.render_figure_svg",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.explore-panel.get",
        "command_path": "view explore-panel get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. Returns the Explore panel the caller saved on this view, {height, cards}, or {} when none is saved. It is a per-user preference: other users do not see it. VIEW_ID is the only id needed.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExplorePanelGetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only. Returns the Explore panel the caller saved on this view, {height, cards}, or {} when none is saved. It is a per-user preference: other users do not see it. VIEW_ID is the only id needed.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExplorePanelGetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.explore-panel.set",
        "command_path": "view explore-panel set",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Saves the Explore cards of the calling user for a view; it shows nothing by itself. Open a card per column with {\"panel\": {\"columns\": \"all\"}} or {\"panel\": {\"columns\": [\"Region\", \"Amount\"]}}: each named column that has no card gets one and the saved cards stay. To replace the whole panel, run view explore-panel get first and write back {\"panel\": {\"cards\": [...]}}. A panel with no cards list is refused, because the web app shows only cards. The result carries \"panel\", the panel read back after the write (what get returns): check its cards to see which are open. It is a per-user preference: it does not change the view or what other users see.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExplorePanelSetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Saves the Explore cards of the calling user for a view; it shows nothing by itself. Open a card per column with {\"panel\": {\"columns\": \"all\"}} or {\"panel\": {\"columns\": [\"Region\", \"Amount\"]}}: each named column that has no card gets one and the saved cards stay. To replace the whole panel, run view explore-panel get first and write back {\"panel\": {\"cards\": [...]}}. A panel with no cards list is refused, because the web app shows only cards. The result carries \"panel\", the panel read back after the write (what get returns): check its cards to see which are open. It is a per-user preference: it does not change the view or what other users see.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelSetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.azure-blob",
        "command_path": "view export azure-blob",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportAzureBlobResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportAzureBlobResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.bigquery",
        "command_path": "view export bigquery",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Require upsert keys for UPSERT and type both partition variants. With export_type REPLACE (the default) it drops and recreates the destination table on this export and on every later run of the view's pipeline; refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportBigqueryResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Require upsert keys for UPSERT and type both partition variants. With export_type REPLACE (the default) it drops and recreates the destination table on this export and on every later run of the view's pipeline; refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportBigqueryResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "returns_job",
        "canonical_command": "view.export.create",
        "command_path": "view export create",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Replace open destination dictionaries with the typed destination union.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportCreateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "AddExport",
        "pagination_policy": "none",
        "preconditions": "Replace open destination dictionaries with the typed destination union.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.export.csv",
        "command_path": "view export csv",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "SDK target for view export csv VIEW_ID; uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportCsvResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "SDK target for view export csv VIEW_ID; uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportCsvResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.export.dataset",
        "command_path": "view export dataset",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Mutation class dynamic: benign_mutation for a new target, destructive when replacing an existing target. Omit dataset_name unless the user gave one; the product default 'Result Dataset' is used (never invent a name such as the view's name). The export is appended to the source pipeline (end_of_pipeline) and re-runs with it; target_project_id sends the dataset into another project (cross-project branch-out, proven on release). Result: {dataset_id, project_id, source_view_id, next}. Not a plain copy: this leaves a live export on the source and the new dataset refreshes from the source view, so keep that working view and name it as the new dataset's source. For an independent copy of a dataset use dataset create with ds_creation_type clone. Writing into an existing dataset (target_ds_id, save_as_mode APPEND_TO_DS or REPLACE_IN_DS; both run the same backend append code, so both get these guards): omit column_mapping and every column is mapped by name; a non-empty column_mapping is used as-is, so it must map every source column to an existing target column, and a partial mapping or an unknown destination is refused (append_mapping_incomplete) before anything is written. A target column that nothing fills (a column the source view lacks and column_mapping does not target) would be NULL in every appended row: refused (append_leaves_columns_blank) unless the input lists exactly those column names in blank_columns (a blanket true or a different list is refused); the confirmed blanks are named in row_check.warnings. Do not reshape the source view to dodge this. A mapped pair of different types is reported in row_check.warnings. A new dataset (no target_ds_id) leaves out the view's hidden columns; they are named in row_check.warnings. To stack two datasets (a union, new rows below the old): there is no union step, so export the second dataset's view into the first with save_as_mode APPEND_TO_DS and target_ds_id the first dataset (columns are matched by name). The export stays a step of the source view and runs again when that view's pipeline re-runs, so after a refresh check the target's row count for rows added twice. A real union step needs backend work.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportDatasetResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Mutation class dynamic: benign_mutation for a new target, destructive when replacing an existing target. Omit dataset_name unless the user gave one; the product default 'Result Dataset' is used (never invent a name such as the view's name). The export is appended to the source pipeline (end_of_pipeline) and re-runs with it; target_project_id sends the dataset into another project (cross-project branch-out, proven on release). Result: {dataset_id, project_id, source_view_id, next}. Not a plain copy: this leaves a live export on the source and the new dataset refreshes from the source view, so keep that working view and name it as the new dataset's source. For an independent copy of a dataset use dataset create with ds_creation_type clone. Writing into an existing dataset (target_ds_id, save_as_mode APPEND_TO_DS or REPLACE_IN_DS; both run the same backend append code, so both get these guards): omit column_mapping and every column is mapped by name; a non-empty column_mapping is used as-is, so it must map every source column to an existing target column, and a partial mapping or an unknown destination is refused (append_mapping_incomplete) before anything is written. A target column that nothing fills (a column the source view lacks and column_mapping does not target) would be NULL in every appended row: refused (append_leaves_columns_blank) unless the input lists exactly those column names in blank_columns (a blanket true or a different list is refused); the confirmed blanks are named in row_check.warnings. Do not reshape the source view to dodge this. A mapped pair of different types is reported in row_check.warnings. A new dataset (no target_ds_id) leaves out the view's hidden columns; they are named in row_check.warnings. To stack two datasets (a union, new rows below the old): there is no union step, so export the second dataset's view into the first with save_as_mode APPEND_TO_DS and target_ds_id the first dataset (columns are matched by name). The export stays a step of the source view and runs again when that view's pipeline re-runs, so after a refresh check the target's row count for rows added twice. A real union step needs backend work.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportDatasetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "view.export.delete",
        "command_path": "view export delete",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportDeleteResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "DeleteExport",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.export.download",
        "command_path": "view export download",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "SDK target for view export download VIEW_ID. The format goes in the input, e.g. mammoth view export download 123 --input '{\"file_type\": \"xlsx\"}' (csv, xlsx, json, ndjson, xml, yaml or parquet; csv by default). Uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportDownloadResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "SDK target for view export download VIEW_ID. The format goes in the input, e.g. mammoth view export download 123 --input '{\"file_type\": \"xlsx\"}' (csv, xlsx, json, ndjson, xml, yaml or parquet; csv by default). Uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportDownloadResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.elasticsearch",
        "command_path": "view export elasticsearch",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Validate protocol and positive chunk size.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportElasticsearchResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Validate protocol and positive chunk size.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportElasticsearchResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.email",
        "command_path": "view export email",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Outbound email stays contract-only until a dedicated sink and recipient allowlist exist.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportEmailResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Outbound email stays contract-only until a dedicated sink and recipient allowlist exist.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportEmailResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.ftp",
        "command_path": "view export ftp",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportFtpResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportFtpResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.export.get",
        "command_path": "view export get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExportGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineExport",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.export.list",
        "command_path": "view export list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Lists the saved exports of one view (internal datasets, databases, cloud storage, REST); read-only.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExportListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineExports",
        "pagination_policy": "offset",
        "preconditions": "Lists the saved exports of one view (internal datasets, databases, cloud storage, REST); read-only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.export.live-link",
        "command_path": "view export live-link",
        "confirmation": "yes_always",
        "contract": {
          "async": "always_wait",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs a plan that includes live links; the backend's refusal is returned as is.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportLiveLinkResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Needs a plan that includes live links; the backend's refusal is returned as is.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportLiveLinkResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.export.managed-s3",
        "command_path": "view export managed-s3",
        "confirmation": "yes_always",
        "contract": {
          "async": "always_wait",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Alias `view export s3`. A download-only destination starts and waits; any other destination sends data outside Mammoth and needs confirmation.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportManagedS3Result",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Alias `view export s3`. A download-only destination starts and waits; any other destination sends data outside Mammoth and needs confirmation.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportManagedS3Result",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.mssql",
        "command_path": "view export mssql",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportMssqlResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportMssqlResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.mysql",
        "command_path": "view export mysql",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportMysqlResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportMysqlResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.onedrive",
        "command_path": "view export onedrive",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportOnedriveResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportOnedriveResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.postgres",
        "command_path": "view export postgres",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportPostgresResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportPostgresResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.powerbi",
        "command_path": "view export powerbi",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Needs the Power BI account username and password, the Azure AD app's client_id, and the target Power BI dataset and table; the password is a secret field, so pass it in the request file, never in argv. Becomes a persistent pipeline step, like 'view export dataset'; the target refreshes automatically every time the source view's pipeline reruns, not just once at call time.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportPowerbiResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Needs the Power BI account username and password, the Azure AD app's client_id, and the target Power BI dataset and table; the password is a secret field, so pass it in the request file, never in argv. Becomes a persistent pipeline step, like 'view export dataset'; the target refreshes automatically every time the source view's pipeline reruns, not just once at call time.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportPowerbiResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "view.export.publish-db",
        "command_path": "view export publish-db",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Becomes a persistent pipeline step, like 'view export dataset'; the published target refreshes automatically every time the source view's pipeline reruns, not just once at call time. It drops and recreates the destination table each time (any existing table of that name is lost), so it is refused unless the input sets replace_table to true (replace_table_not_acknowledged).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportPublishDbResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/publish-to-db",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "CreatePublishToDb",
        "pagination_policy": "none",
        "preconditions": "Becomes a persistent pipeline step, like 'view export dataset'; the published target refreshes automatically every time the source view's pipeline reruns, not just once at call time. It drops and recreates the destination table each time (any existing table of that name is lost), so it is refused unless the input sets replace_table to true (replace_table_not_acknowledged).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportPublishDbResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.publish_db",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "view.export.publish-db-update",
        "command_path": "view export publish-db-update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportPublishDbUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/publish-to-db",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "UpdatePublishToDb",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportPublishDbUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.publish_db_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.redshift",
        "command_path": "view export redshift",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportRedshiftResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportRedshiftResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.rest",
        "command_path": "view export rest",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Type all auth variants, reject secrets in static headers/query/body, allow insecure TLS only with --yes.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportRestResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Type all auth variants, reject secrets in static headers/query/body, allow insecure TLS only with --yes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportRestResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "always_wait",
        "canonical_command": "view.export.rest-fill",
        "command_path": "view export rest-fill",
        "confirmation": "yes_always",
        "contract": {
          "async": "always_wait",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Makes Mammoth's server fetch the docs URL and propose REST export settings; nothing is configured or sent. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportRestFillResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/rest-fill",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "Suggest",
        "pagination_policy": "none",
        "preconditions": "Makes Mammoth's server fetch the docs URL and propose REST export settings; nothing is configured or sent. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportRestFillResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.rest_fill",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.export.runs",
        "command_path": "view export runs",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExportRunsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}/runs",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListExportRuns",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportRunsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.runs",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.sftp",
        "command_path": "view export sftp",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Enforce authentication-mode union (password vs key) and forbid irrelevant secrets.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportSftpResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Enforce authentication-mode union (password vs key) and forbid irrelevant secrets.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportSftpResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.sharepoint",
        "command_path": "view export sharepoint",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Validate site URL.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportSharepointResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Validate site URL.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportSharepointResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": null,
        "async": "returns_job",
        "canonical_command": "view.export.tableau",
        "command_path": "view export tableau",
        "confirmation": "yes_always",
        "contract": {
          "async": "returns_job",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prohibit secret in CA bundle file.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewExportTableauResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Prohibit secret in CA bundle file.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportTableauResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "view.export.update",
        "command_path": "view export update",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "external_effect",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Merge-style: --input is the fields to change (save_as_mode, target_properties, additional_properties, condition, end_of_pipeline, sequence, run_immediately, schedule, send_window) or {\"patches\": [...]}. A replace of params keeps what it leaves out from the stored export and keeps the export pinned to the end of the pipeline unless it sets end_of_pipeline false (sequence null means pinned; a number unpins, and a sequence without end_of_pipeline false is refused). The stored schedule and send_window are sent back with the edit. A command patch needs no value: {\"op\":\"command\",\"path\":\"run\"} (also suspend, restore, discard).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportUpdateResult",
          "scope": "project",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "external_effect",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "external_effect",
        "operation_id": "EditExport",
        "pagination_policy": "none",
        "preconditions": "Merge-style: --input is the fields to change (save_as_mode, target_properties, additional_properties, condition, end_of_pipeline, sequence, run_immediately, schedule, send_window) or {\"patches\": [...]}. A replace of params keeps what it leaves out from the stored export and keeps the export pinned to the end of the pipeline unless it sets end_of_pipeline false (sequence null means pinned; a number unpins, and a sequence without end_of_pipeline false is refused). The stored schedule and send_window are sent back with the edit. A command patch needs no value: {\"op\":\"command\",\"path\":\"run\"} (also suspend, restore, discard).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "returns_job",
        "canonical_command": "view.exportable-config.apply",
        "command_path": "view exportable-config apply",
        "confirmation": "confirm_target",
        "contract": {
          "async": "returns_job",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exactly one of items or config is required; explicit dataset parent is preferred. config must be the full document returned by view exportable-config get (metadata, display_properties, dependencies, tasks, checkpoints, derivatives, data_checks) with your edits applied; the job rejects a bare {\"tasks\": []} (verified on release 2026-09-19). Round-trip get -> edit -> apply.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewExportableConfigApplyResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/exportable-config",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": "ApplyExportableConfig",
        "pagination_policy": "none",
        "preconditions": "Exactly one of items or config is required; explicit dataset parent is preferred. config must be the full document returned by view exportable-config get (metadata, display_properties, dependencies, tasks, checkpoints, derivatives, data_checks) with your edits applied; the job rejects a bare {\"tasks\": []} (verified on release 2026-09-19). Round-trip get -> edit -> apply.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportableConfigApplyResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.apply_exportable_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "returns_job"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.exportable-config.get",
        "command_path": "view exportable-config get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "View-centric read; dataset_id may be supplied as the explicit parent.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewExportableConfigGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/exportable-config",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetExportableConfig",
        "pagination_policy": "none",
        "preconditions": "View-centric read; dataset_id may be supplied as the explicit parent.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportableConfigGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.get_exportable_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.get",
        "command_path": "view get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "BLOCKED[B10 VIEW_DATASET_RESOLUTION]: calls the private pipeline discovery helper.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDataviewInformationIndividual",
        "pagination_policy": "none",
        "preconditions": "BLOCKED[B10 VIEW_DATASET_RESOLUTION]: calls the private pipeline discovery helper.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.client.ViewsResource.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.impact",
        "command_path": "view impact",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. What deleting a pipeline task (scope task, with task_id) or the whole view (scope view) would affect: dashboards, exports, dependent views and automations. Pass scope in --input. Run it before view task delete or view trash, and say what it lists before asking to go ahead.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewImpactResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDataviewDeleteImpact",
        "pagination_policy": "none",
        "preconditions": "Read-only. What deleting a pipeline task (scope task, with task_id) or the whole view (scope view) would affect: dashboards, exports, dependent views and automations. Pass scope in --input. Run it before view task delete or view trash, and say what it lists before asking to go ahead.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewImpactResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.delete_impact",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.list",
        "command_path": "view list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "B01. Each view names its dataset (dataset_id and dataset_name) and carries rows and cols, created and updated time, the dataset's source kind, its column names with types and stored per-column sample_values (one stored-stats read per listed view, all made at once, no query), plus built_from and feeds (the view ids it reads and the ones that read it), pipeline_status when not ready, and in_sync false when its data is stale; cut to fit the agent tool output cap (next_dataset_offset and views_omitted say where the rest is). Newest first. full true returns the raw records.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListDataviews",
        "pagination_policy": "single_page",
        "preconditions": "B01. Each view names its dataset (dataset_id and dataset_name) and carries rows and cols, created and updated time, the dataset's source kind, its column names with types and stored per-column sample_values (one stored-stats read per listed view, all made at once, no query), plus built_from and feeds (the view ids it reads and the ones that read it), pipeline_status when not ready, and in_sync false when its data is stale; cut to fit the agent tool output cap (next_dataset_offset and views_omitted say where the rest is). Newest first. full true returns the raw records.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "start_or_wait",
        "canonical_command": "view.optimize",
        "command_path": "view optimize",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "start_or_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "VIEW_ID is the only id needed; the CLI looks up the dataset. If DATASET_ID is given it comes second (the SDK method takes them the other way round) and must be the dataset of that view. Writes the pipeline: applies the safe findings of view analyze (all of them, or only the rules in the apply_rules input field: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter) and reruns the view. Waits for the rerun job and adds job_state and job_result. The result lists applied, skipped (rule, seqs, reason), before_steps and after_steps. Run view analyze first and say what it found before asking to go ahead.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewOptimizeResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/optimize",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": "OptimizePipeline",
        "pagination_policy": "none",
        "preconditions": "VIEW_ID is the only id needed; the CLI looks up the dataset. If DATASET_ID is given it comes second (the SDK method takes them the other way round) and must be the dataset of that view. Writes the pipeline: applies the safe findings of view analyze (all of them, or only the rules in the apply_rules input field: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter) and reruns the view. Waits for the rerun job and adds job_state and job_result. The result lists applied, skipped (rule, seqs, reason), before_steps and after_steps. Run view analyze first and say what it found before asking to go ahead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewOptimizeResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.optimize",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "start_or_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.parameter-context",
        "command_path": "view parameter-context",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewParameterContextResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/parameter-context",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetParameterContext",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewParameterContextResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.parameter_context",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.pipeline.edit",
        "command_path": "view pipeline edit",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Strict nonempty patches; each allowed path has a discriminated model and its own safety class (operation-dependent).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewPipelineEditResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditPipeline",
        "pagination_policy": "none",
        "preconditions": "Strict nonempty patches; each allowed path has a discriminated model and its own safety class (operation-dependent).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewPipelineEditResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.edit_pipeline",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.pipeline.get",
        "command_path": "view pipeline get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewPipelineGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipeline",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.get_pipeline",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.pipeline.items",
        "command_path": "view pipeline items",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires the exact parent dataset_id through --input; follow and validate every next-page URL before counting saved task definitions. The CLI does not paginate automatically.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewPipelineItemsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/items",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineItems",
        "pagination_policy": "none",
        "preconditions": "Requires the exact parent dataset_id through --input; follow and validate every next-page URL before counting saved task definitions. The CLI does not paginate automatically.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineItemsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.items",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.pipeline.items-all",
        "command_path": "view pipeline items-all",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Reuses the exact-parent items route with bounded offset pagination; rejects repeated/non-advancing pages and excessive page counts. The CLI view.pipeline.items command remains single-page.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewPipelineItemsAllResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "offset",
        "preconditions": "Reuses the exact-parent items route with bounded offset pagination; rejects repeated/non-advancing pages and excessive page counts. The CLI view.pipeline.items command remains single-page.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineItemsAllResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.pipeline.rerun",
        "command_path": "view pipeline rerun",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "A rerun fires every end-of-pipeline export of the view again (database, email, REST, dataset); the result lists them in exports_fired (export_id, handler_type, target) so the external effect is visible. --dry-run returns the same exports_fired without running. An internal_dataset export that appends or replaces into an existing dataset also carries blank_columns: the sorted destination column names the write would leave NULL ([] when none).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewPipelineRerunResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/rerun",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RerunFromSequence",
        "pagination_policy": "none",
        "preconditions": "A rerun fires every end-of-pipeline export of the view again (database, email, REST, dataset); the result lists them in exports_fired (export_id, handler_type, target) so the external effect is visible. --dry-run returns the same exports_fired without running. An internal_dataset export that appends or replaces into an existing dataset also carries blank_columns: the sorted destination column names the write would leave NULL ([] when none).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewPipelineRerunResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.rerun",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.pipeline.wait",
        "command_path": "view pipeline wait",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Global --pipeline-timeout supplies timeout; do not expose poll_interval in v1.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewPipelineWaitResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Global --pipeline-timeout supplies timeout; do not expose poll_interval in v1.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineWaitResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.preview",
        "command_path": "view preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewPreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetDataviewPreview",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.preview",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.restore",
        "command_path": "view restore",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewRestoreResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/restore",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RestoreDataview",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewRestoreResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.restore",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.summary",
        "command_path": "view summary",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewSummaryResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/summary",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPanelSummary",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewSummaryResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.summary",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.task.add",
        "command_path": "view task add",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Strict task discriminated union only.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewTaskAddResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": "AddTask",
        "pagination_policy": "none",
        "preconditions": "Strict task discriminated union only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.add_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.task.delete",
        "command_path": "view task delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "always_wait",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewTaskDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteTask",
        "pagination_policy": "none",
        "preconditions": "Prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.delete_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.task.get",
        "command_path": "view task get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery when reconciling saved task definitions.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewTaskGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineTask",
        "pagination_policy": "none",
        "preconditions": "Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery when reconciling saved task definitions.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.get_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.task.list",
        "command_path": "view task list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "single_page until B5; no --all until continuation is proven. Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery for saved-task reads.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewTaskListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineTasks",
        "pagination_policy": "single_page",
        "preconditions": "single_page until B5; no --all until continuation is proven. Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery for saved-task reads.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.list_tasks",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "always_wait",
        "canonical_command": "view.task.preview",
        "command_path": "view task preview",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewTaskPreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/task_preview",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetTaskPreview",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskPreviewResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.preview_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.task.preview-cancel",
        "command_path": "view task preview-cancel",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: DATAVIEW_ID, JOB_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewTaskPreviewCancelResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/task_preview/{job_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CancelTaskPreview",
        "pagination_policy": "none",
        "preconditions": "Required inputs: DATAVIEW_ID, JOB_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskPreviewCancelResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.preview_cancel",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.task.update",
        "command_path": "view task update",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Strict replacement task union. task_spec may be the params `view task get` returns: the server-written keys (EXECUTION_TIMESTAMP, TASK_NAMESPACE) are dropped before the send and TASK_KEY is kept (the server ignores it). A refusal names the keys sent beyond the envelope. To change a SQL step: get the task, edit task_spec.SQL.QUERY (keep DATAVIEW_ID and SEQUENCE_NUMBER), send it back.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewTaskUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": "EditTask",
        "pagination_policy": "none",
        "preconditions": "Strict replacement task union. task_spec may be the params `view task get` returns: the server-written keys (EXECUTION_TIMESTAMP, TASK_NAMESPACE) are dropped before the send and TASK_KEY is kept (the server ignores it). A refusal names the keys sent beyond the envelope. To change a SQL step: get the task, edit task_spec.SQL.QUERY (keep DATAVIEW_ID and SEQUENCE_NUMBER), send it back.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.update_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.add-column",
        "command_path": "view transform add-column",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the new column name is unused and the types of any column it is built from.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformAddColumnResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the new column name is unused and the types of any column it is built from.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAddColumnResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.add-sql",
        "command_path": "view transform add-sql",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Single-view SQL: the only table is \"view:VIEW_ID\" (the view the task is added to); a second view in FROM or JOIN is rejected (5GENR010 \"only one table allowed\"), use view transform join for that. UNION ALL over the same view, CASE, DATE_TRUNC, GROUP BY and COUNT(DISTINCT ...) run on release. Result columns must be NUMERIC, TEXT or TIMESTAMPTZ: CAST(x AS DATE) is rejected (5GENR010 \"Invalid column type DATE\"); CAST(x AS TIMESTAMPTZ) or DATE_TRUNC land as a DATE column. The task replaces every column of the view; run it on a copy (view export dataset) when the source columns are still needed. Read the result back with view data get. Evidence: docs/capability-evidence/ilg-sim-20260919.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformAddSqlResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Single-view SQL: the only table is \"view:VIEW_ID\" (the view the task is added to); a second view in FROM or JOIN is rejected (5GENR010 \"only one table allowed\"), use view transform join for that. UNION ALL over the same view, CASE, DATE_TRUNC, GROUP BY and COUNT(DISTINCT ...) run on release. Result columns must be NUMERIC, TEXT or TIMESTAMPTZ: CAST(x AS DATE) is rejected (5GENR010 \"Invalid column type DATE\"); CAST(x AS TIMESTAMPTZ) or DATE_TRUNC land as a DATE column. The task replaces every column of the view; run it on a copy (view export dataset) when the source columns are still needed. Read the result back with view data get. Evidence: docs/capability-evidence/ilg-sim-20260919.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAddSqlResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.ai",
        "command_path": "view transform ai",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; record addon and data-processing notice in help (data can be processed by an AI feature).",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformAiResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; record addon and data-processing notice in help (data can be processed by an AI feature).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAiResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.batch",
        "command_path": "view transform batch",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use when several transforms go on one view in a row (filter, then limit, then a sort): one call, one pipeline run, one verified outcome (row_check, and tasks with each new task's transform_status) instead of one call and one run per step. --input: \"steps\", a list of {\"op\", \"input\"}; op is filter, sort, limit-rows, discard-duplicates, fill-missing, bulk-replace, replace, text, substring, extract-date, increment-date, copy-columns, split, unnest or pivot, and input is exactly what that view transform command takes (display names). unnest and pivot replace the view's columns, so they can only be the last step, and no sort step may come before them.  Every step is checked against the view's columns as they are NOW before anything is sent, so a step can use a column an earlier step adds (split, copy-columns, or the new_column of substring, extract-date, increment-date) but no other column that does not exist yet. A sort is the view's row order, not a task: it is set after the tasks have run. A batch skips the per-op no-op check (a filter that matches every row still adds its task). If a task fails the batch's tasks are removed, the view is as before, and the error names steps[i] (batch_step_failed). In draft mode the tasks are staged, not run.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformBatchResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use when several transforms go on one view in a row (filter, then limit, then a sort): one call, one pipeline run, one verified outcome (row_check, and tasks with each new task's transform_status) instead of one call and one run per step. --input: \"steps\", a list of {\"op\", \"input\"}; op is filter, sort, limit-rows, discard-duplicates, fill-missing, bulk-replace, replace, text, substring, extract-date, increment-date, copy-columns, split, unnest or pivot, and input is exactly what that view transform command takes (display names). unnest and pivot replace the view's columns, so they can only be the last step, and no sort step may come before them.  Every step is checked against the view's columns as they are NOW before anything is sent, so a step can use a column an earlier step adds (split, copy-columns, or the new_column of substring, extract-date, increment-date) but no other column that does not exist yet. A sort is the view's row order, not a task: it is set after the tasks have run. A batch skips the per-op no-op check (a filter that matches every row still adds its task). If a task fails the batch's tasks are removed, the view is as before, and the error names steps[i] (batch_step_failed). In draft mode the tasks are staged, not run.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformBatchResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.bulk-replace",
        "command_path": "view transform bulk-replace",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Complete flags/defaults/result/draft/undo/live contract is specified in plan 02's 'Complete bulk-replace command contract'; this appendix does not narrow or replace it. columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformBulkReplaceResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Complete flags/defaults/result/draft/undo/live contract is specified in plan 02's 'Complete bulk-replace command contract'; this appendix does not narrow or replace it. columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformBulkReplaceResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.combine-columns",
        "command_path": "view transform combine-columns",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; reject the SDK's undocumented __literal__: source escape at the CLI boundary. Exactly one of new_column or existing_column is required; both or neither is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformCombineColumnsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; reject the SDK's undocumented __literal__: source escape at the CLI boundary. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCombineColumnsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.convert-type",
        "command_path": "view transform convert-type",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to count values that will not convert (they become empty). A DATE conversion of a text column takes input_formats (list of the layouts it mixes), output_format (display layout) and input_format_preference (uk or us for day/month ambiguity; strict blanks ambiguous day/month values and converts equal-part dates) on the conversions entry; format (python-style date_format) still works.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformConvertTypeResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to count values that will not convert (they become empty). A DATE conversion of a text column takes input_formats (list of the layouts it mixes), output_format (display layout) and input_format_preference (uk or us for day/month ambiguity; strict blanks ambiguous day/month values and converts equal-part dates) on the conversions entry; format (python-style date_format) still works.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformConvertTypeResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.copy-columns",
        "command_path": "view transform copy-columns",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the source columns exist and the new names are unused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformCopyColumnsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the source columns exist and the new names are unused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCopyColumnsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.crosstab",
        "command_path": "view transform crosstab",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Dynamic safety class: new target needs no confirmation, append needs --yes, replacing an existing target needs --yes --confirm TARGET_DS_ID. The crosstab is a standing export on the source view: it rewrites the output dataset on every pipeline run, and the result says so (refreshes_on_pipeline_run, note). A target the view already exports into, the view's own dataset, and a view held in a draft are refused, as for view export dataset.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformCrosstabResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Dynamic safety class: new target needs no confirmation, append needs --yes, replacing an existing target needs --yes --confirm TARGET_DS_ID. The crosstab is a standing export on the source view: it rewrites the output dataset on every pipeline run, and the result says so (refreshes_on_pipeline_run, note). A target the view already exports into, the view's own dataset, and a view held in a draft are refused, as for view export dataset.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCrosstabResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.date-diff",
        "command_path": "view transform date-diff",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). start/end must both be existing DATE columns; there is no today input here. To diff against the current execution time (e.g. days since order), the server task itself supports it but this typed command does not expose it: use view task add with a raw task_spec: {\"DATE_DIFF\": {\"COMPONENT\": \"DAY\", \"MINUEND\": {\"TYPE\": \"__TIME__\"}, \"SUBTRAHEND\": {\"TYPE\": \"COLUMN\", \"VALUE\": \"INTERNAL_COLUMN_NAME\"}, \"AS\": {\"COLUMN\": \"Days Since Order\", \"TYPE\": \"NUMERIC\", \"INTERNAL_NAME\": \"column_days_since_order\"}}}, where INTERNAL_COLUMN_NAME is that column's internal_name from view get (not its display name -- a raw task skips display-name resolution). MINUEND minus SUBTRAHEND; swap them to flip the sign. Evidence: mvc-service api/api/dataview/helpers/validators/date_diff.py (allowed TYPE values COLUMN/VALUE/SYSTEM_TIME) and CommonConstants/dba_const.py KEYWORDS.SYSTEM_TIME = \"__TIME__\".",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformDateDiffResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). start/end must both be existing DATE columns; there is no today input here. To diff against the current execution time (e.g. days since order), the server task itself supports it but this typed command does not expose it: use view task add with a raw task_spec: {\"DATE_DIFF\": {\"COMPONENT\": \"DAY\", \"MINUEND\": {\"TYPE\": \"__TIME__\"}, \"SUBTRAHEND\": {\"TYPE\": \"COLUMN\", \"VALUE\": \"INTERNAL_COLUMN_NAME\"}, \"AS\": {\"COLUMN\": \"Days Since Order\", \"TYPE\": \"NUMERIC\", \"INTERNAL_NAME\": \"column_days_since_order\"}}}, where INTERNAL_COLUMN_NAME is that column's internal_name from view get (not its display name -- a raw task skips display-name resolution). MINUEND minus SUBTRAHEND; swap them to flip the sign. Evidence: mvc-service api/api/dataview/helpers/validators/date_diff.py (allowed TYPE values COLUMN/VALUE/SYSTEM_TIME) and CommonConstants/dba_const.py KEYWORDS.SYSTEM_TIME = \"__TIME__\".",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDateDiffResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.delete-columns",
        "command_path": "view transform delete-columns",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; task deletion restores columns only when the task ID is stable.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformDeleteColumnsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; task deletion restores columns only when the task ID is stable.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDeleteColumnsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.discard-duplicates",
        "command_path": "view transform discard-duplicates",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` (or `view data aggregate` counting rows grouped by the key columns) to count the duplicate rows this will drop. Edits the view in place: to keep the original, `view create` a copy first. Input: \"key_columns\" (only these columns decide a duplicate; every other column is ignored) or \"ignore_columns\" (these columns are left out of the comparison), not both. A batch step takes ignore_columns only.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformDiscardDuplicatesResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` (or `view data aggregate` counting rows grouped by the key columns) to count the duplicate rows this will drop. Edits the view in place: to keep the original, `view create` a copy first. Input: \"key_columns\" (only these columns decide a duplicate; every other column is ignored) or \"ignore_columns\" (these columns are left out of the comparison), not both. A batch step takes ignore_columns only.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDiscardDuplicatesResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.extract-date",
        "command_path": "view transform extract-date",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE (run convert-type first if TEXT) and `view data get` to check a few values. For a month bucket use `year_month_number` (\"2026-10\"), which sorts in time order; `year_month` (\"2026, October\") sorts alphabetically on a chart axis.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformExtractDateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE (run convert-type first if TEXT) and `view data get` to check a few values. For a month bucket use `year_month_number` (\"2026-10\"), which sorts in time order; `year_month` (\"2026, October\") sorts alphabetically on a chart axis.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformExtractDateResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.fill-missing",
        "command_path": "view transform fill-missing",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` for the blank count of the column, so the result can be compared to it.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformFillMissingResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` for the blank count of the column, so the result can be compared to it.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFillMissingResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.filter",
        "command_path": "view transform filter",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows that match with `view data aggregate` using the same condition, and the total with no condition.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformFilterResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows that match with `view data aggregate` using the same condition, and the total with no condition.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFilterResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.first-name",
        "command_path": "view transform first-name",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use for \"extract the first name\" or the first word of a text column. --input: \"column\" (a TEXT column, required) and exactly one of \"new_column\" or \"existing_column\". Takes the text up to the first space. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformFirstNameResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use for \"extract the first name\" or the first word of a text column. --input: \"column\" (a TEXT column, required) and exactly one of \"new_column\" or \"existing_column\". Takes the text up to the first space. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFirstNameResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.generate-sql",
        "command_path": "view transform generate-sql",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Writes and validates a SQL query from the intent and returns it as data.sql; it does not change the view (release, 2026-09-25: no task was added). Apply the query with view transform add-sql (data.apply is the exact command); add-sql replaces the view's columns with the result.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformGenerateSqlResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Writes and validates a SQL query from the intent and returns it as data.sql; it does not change the view (release, 2026-09-25: no task was added). Apply the query with view transform add-sql (data.apply is the exact command); add-sql replaces the view's columns with the result.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformGenerateSqlResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.increment-date",
        "command_path": "view transform increment-date",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE, and `view data get` to check a few values.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformIncrementDateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE, and `view data get` to check a few values.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformIncrementDateResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.join",
        "command_path": "view transform join",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`) and run this with `--dry-run` for `join_preview.match_rate`.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformJoinResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`) and run this with `--dry-run` for `join_preview.match_rate`.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformJoinResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.json-extract",
        "command_path": "view transform json-extract",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). json_type=LIST (JSON_LIST_TO_ROWS) gives one row per list element, landing in an Item column (plus an Index column for its original position); with no keys/extractions this is the default. An object element does not get columns from this call -- run a second json-extract (json_type=OBJECT) on Item to turn its keys into columns. An extraction key is one object key (a string) or a path to a nested value, a non-empty JSON list of keys (strings) and array indexes (integers from 0), for example \"key\" [\"company\", \"location\", \"country\"] or [\"orders\", 0, \"total\"]. A path with no as_name names its column company.location.country.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformJsonExtractResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). json_type=LIST (JSON_LIST_TO_ROWS) gives one row per list element, landing in an Item column (plus an Index column for its original position); with no keys/extractions this is the default. An object element does not get columns from this call -- run a second json-extract (json_type=OBJECT) on Item to turn its keys into columns. An extraction key is one object key (a string) or a path to a nested value, a non-empty JSON list of keys (strings) and array indexes (integers from 0), for example \"key\" [\"company\", \"location\", \"country\"] or [\"orders\", 0, \"total\"]. A path with no as_name names its column company.location.country.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformJsonExtractResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.limit-rows",
        "command_path": "view transform limit-rows",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the current row count, so the row count after can be checked against N. `limit` is accepted as an alias of `n`; give one, not both.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformLimitRowsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the current row count, so the row count after can be checked against N. `limit` is accepted as an alias of `n`; give one, not both.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformLimitRowsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.lookup",
        "command_path": "view transform lookup",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`); the lookup view must have one row per key. Exactly one of new_column or existing_column is required; both or neither is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformLookupResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`); the lookup view must have one row per key. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformLookupResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.math",
        "command_path": "view transform math",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the types of the columns in the expression, and run it with `--dry-run` to validate the expression. Exactly one of new_column or existing_column is required; both or neither is refused. A parameter is written {name} in the expression (a project or workspace parameter of that name; an unknown name is refused): the step uses its value and re-runs when the value changes.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformMathResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the types of the columns in the expression, and run it with `--dry-run` to validate the expression. Exactly one of new_column or existing_column is required; both or neither is refused. A parameter is written {name} in the expression (a project or workspace parameter of that name; an unknown name is refused): the step uses its value and re-runs when the value changes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformMathResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.pivot",
        "command_path": "view transform pivot",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Replaces the view's columns with the summary, so run it last (export rows first). Every as_name must be a display name that does not already exist on the view (4DTVW018 SAME_DISPLAY_NAME_CANNOT_BE_REUSED): aggregate a joined column under a new name.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformPivotResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Replaces the view's columns with the summary, so run it last (export rows first). Every as_name must be a display name that does not already exist on the view (4DTVW018 SAME_DISPLAY_NAME_CANNOT_BE_REUSED): aggregate a joined column under a new name.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformPivotResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.transform.rename-columns",
        "command_path": "view transform rename-columns",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's column rename), not a pipeline task: it changes no data and adds no task.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformRenameColumnsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's column rename), not a pipeline task: it changes no data and adds no task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformRenameColumnsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.repeat-rows",
        "command_path": "view transform repeat-rows",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Adds rows: the view ends with its row count times the copies. Give exactly one of times (2 to 10000 copies, writes no column), values (1 to 1000 unique values; TEXT or NUMERIC) or series (a date range: start, end, delta of one of years, months, weeks, days; or a number range: start, end, step above 0). values and series need exactly one of new_column or existing_column (new_column_type TEXT or NUMERIC for values; a series implies DATE or NUMERIC). keep_original is for values into existing_column only. order (GROUPED or INTERLEAVED) is not for times. A series bound may be {\"kind\": \"START_OF_YEAR\"} or {\"kind\": \"EARLIEST\", \"column\": \"<date column>\"} for start and {\"kind\": \"TODAY\"} for end. No condition. Observe first: `view get VIEW_ID` for the row count, since the result is limited to 10 million rows.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformRepeatRowsResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Adds rows: the view ends with its row count times the copies. Give exactly one of times (2 to 10000 copies, writes no column), values (1 to 1000 unique values; TEXT or NUMERIC) or series (a date range: start, end, delta of one of years, months, weeks, days; or a number range: start, end, step above 0). values and series need exactly one of new_column or existing_column (new_column_type TEXT or NUMERIC for values; a series implies DATE or NUMERIC). keep_original is for values into existing_column only. order (GROUPED or INTERLEAVED) is not for times. A series bound may be {\"kind\": \"START_OF_YEAR\"} or {\"kind\": \"EARLIEST\", \"column\": \"<date column>\"} for start and {\"kind\": \"TODAY\"} for end. No condition. Observe first: `view get VIEW_ID` for the row count, since the result is limited to 10 million rows.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformRepeatRowsResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.replace",
        "command_path": "view transform replace",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformReplaceResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformReplaceResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.set-values",
        "command_path": "view transform set-values",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows the condition matches with `view data aggregate` using the same condition. Exactly one of new_column or existing_column is required; both or neither is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformSetValuesResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows the condition matches with `view data aggregate` using the same condition. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSetValuesResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.small-large",
        "command_path": "view transform small-large",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see its type and range.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformSmallLargeResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see its type and range.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSmallLargeResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "view.transform.sort",
        "command_path": "view transform sort",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's sort), not a pipeline task: data reads and exports return rows in this order. At most three columns. `sort_by` is accepted as an alias of `order_by`; each entry is [column, ASC|DESC] or a string \"column\", \"column asc\" or \"column desc\". A string ending in asc or desc is read as column plus direction, so for a column whose name ends in asc or desc use the pair form [column, ASC|DESC].",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformSortResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's sort), not a pipeline task: data reads and exports return rows in this order. At most three columns. `sort_by` is accepted as an alias of `order_by`; each entry is [column, ASC|DESC] or a string \"column\", \"column asc\" or \"column desc\". A string ending in asc or desc is read as column plus direction, so for a column whose name ends in asc or desc use the pair form [column, ASC|DESC].",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSortResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.split",
        "command_path": "view transform split",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the separator appears in real values.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformSplitResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the separator appears in real values.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSplitResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.substring",
        "command_path": "view transform substring",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see the real value lengths and formats.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformSubstringResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see the real value lengths and formats.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSubstringResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.text",
        "command_path": "view transform text",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see the current values (case, padding, spelling variants).",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformTextResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see the current values (case, padding, spelling variants).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformTextResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.unnest",
        "command_path": "view transform unnest",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the nested values are stored.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformUnnestResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the nested values are stored.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformUnnestResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.update-column",
        "command_path": "view transform update-column",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use to overwrite a numeric column with an expression over its own values (\"add 5 to Cost\"). --input: \"column\" (an existing column, required) and \"expression\" (required, as in view transform math). Same as view transform math with existing_column set. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformUpdateColumnResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use to overwrite a numeric column with an expression over its own values (\"add 5 to Cost\"). --input: \"column\" (an existing column, required) and \"expression\" (required, as in view transform math). Same as view transform math with existing_column set. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformUpdateColumnResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.transform.window",
        "command_path": "view transform window",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "reversible_pipeline",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the column types, and `view data profile` for blanks in the partition and order columns. Exactly one of new_column or existing_column is required; both or neither is refused.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewTransformWindowResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "reversible_pipeline",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "reversible_pipeline",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the column types, and `view data profile` for blanks in the partition and order columns. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformWindowResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.trash",
        "command_path": "view trash",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewTrashResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/trash",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "TrashDataview",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTrashResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.trash",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.update",
        "command_path": "view update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Only the typed rename is offered (--input {\"name\": ...}); any other patch is refused with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "Patch",
        "pagination_policy": "none",
        "preconditions": "Only the typed rename is offered (--input {\"name\": ...}); any other patch is refused with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "always_wait",
        "canonical_command": "view.variants.create",
        "command_path": "view variants create",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Use when the user wants the same view once per value (\"per region\", \"one view for each segment\") and separate views are needed; for one view the viewer filters, use dashboard filter add. --input: \"from_view\" (a view of DATASET_ID whose steps every variant copies, required), \"column\" (a column of that view, required), \"values\" (1 to 50 distinct values, required), optional \"name_template\" (default \"{view} - {value}\"; must make distinct names, so keep {value}). Each variant is a new view cloned from from_view, then filtered to column = value. Refuses an unknown column before creating anything. Stops at the first failure with variants_partial_failure, whose details list the views already created, the failed value, the values not attempted and the unfiltered view left by the failed value (delete it, then rerun the rest). Returns view_ids and per-value variants.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "ViewVariantsCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Use when the user wants the same view once per value (\"per region\", \"one view for each segment\") and separate views are needed; for one view the viewer filters, use dashboard filter add. --input: \"from_view\" (a view of DATASET_ID whose steps every variant copies, required), \"column\" (a column of that view, required), \"values\" (1 to 50 distinct values, required), optional \"name_template\" (default \"{view} - {value}\"; must make distinct names, so keep {value}). Each variant is a new view cloned from from_view, then filtered to column = value. Refuses an unknown column before creating anything. Stops at the first failure with variants_partial_failure, whose details list the views already created, the failed value, the values not attempted and the unfiltered view left by the failed value (delete it, then rerun the rest). Returns view_ids and per-value variants.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewVariantsCreateResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "view.version.apply",
        "command_path": "view version apply",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewVersionApplyResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ApplyPipelineVersion",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionApplyResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.apply",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.version.delete",
        "command_path": "view version delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewVersionDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeletePipelineVersion",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.version.get",
        "command_path": "view version get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewVersionGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineVersion",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewVersionGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "view.version.list",
        "command_path": "view version list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Required inputs: VIEW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "ViewVersionListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetPipelineVersions",
        "pagination_policy": "single_page",
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewVersionListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "view.version.update",
        "command_path": "view version update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "ViewVersionUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "EditPipelineVersion",
        "pagination_policy": "none",
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "webhook": [
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "webhook.create",
        "command_path": "webhook create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Secure creation uses the secret-output rule (--secret-out/--show-secret).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WebhookCreateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/webhooks",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateAWebhook",
        "pagination_policy": "none",
        "preconditions": "Secure creation uses the secret-output rule (--secret-out/--show-secret).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookCreateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "webhook.delete",
        "command_path": "webhook delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Resolve webhook before confirmation.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WebhookDeleteResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteWebhook",
        "pagination_policy": "none",
        "preconditions": "Resolve webhook before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookDeleteResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "webhook.get",
        "command_path": "webhook get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Redact secret.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WebhookGetResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWebhookDetails",
        "pagination_policy": "none",
        "preconditions": "Redact secret.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WebhookGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "webhook.list",
        "command_path": "webhook list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "offset"
          },
          "preconditions": "Current SDK discards pagination metadata.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WebhookListResult",
          "scope": "profile",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/webhooks",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "mutation_class": "read",
        "operation_id": "ListWebhooks",
        "pagination_policy": "offset",
        "preconditions": "Current SDK discards pagination metadata.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WebhookListResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "webhook.send",
        "command_path": "webhook send",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Delivers a payload to the webhook, which ingests it into its dataset. Never retry a send: each call adds data. Check `webhook get` first.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WebhookSendResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /webhooks/data/{webhook_uri}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddDataToWebhook",
        "pagination_policy": "none",
        "preconditions": "Delivers a payload to the webhook, which ingests it into its dataset. Never retry a send: each call adds data. Check `webhook get` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookSendResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.send_data",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "webhook.send-get",
        "command_path": "webhook send-get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "webhook send-get is a mutation despite HTTP GET, and it is never retried. Reject an empty query; never log the URI if the server treats it as a capability.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WebhookSendGetResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "GET /webhooks/data/{webhook_uri}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddDataToWebhookUsingGetMethod",
        "pagination_policy": "none",
        "preconditions": "webhook send-get is a mutation despite HTTP GET, and it is never retried. Reject an empty query; never log the URI if the server treats it as a capability.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookSendGetResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.send_data_get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "webhook.update",
        "command_path": "webhook update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Reject an empty patch; a newly issued secret uses the secret-output rule.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WebhookUpdateResult",
          "scope": "profile",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateWebhookConfigurations",
        "pagination_policy": "none",
        "preconditions": "Reject an empty patch; a newly issued secret uses the secret-output rule.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookUpdateResult",
        "scope": "profile",
        "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      }
    ],
    "workflow": [
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workflow.archive",
        "command_path": "workflow archive",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {archived: true|false, dataset_ids?: [int]}. The dataset ids are the workflow's datasets now; it reads as active once it has others.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowArchiveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PUT /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/archived",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SetArchived",
        "pagination_policy": "none",
        "preconditions": "Input: {archived: true|false, dataset_ids?: [int]}. The dataset ids are the workflow's datasets now; it reads as active once it has others.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowArchiveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.set_archived",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workflow.attach-dataset",
        "command_path": "workflow attach-dataset",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Takes the dataset to attach as the second positional, DATASOURCE_ID. No input document.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowAttachDatasetResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/datasets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AttachDataset",
        "pagination_policy": "none",
        "preconditions": "Takes the dataset to attach as the second positional, DATASOURCE_ID. No input document.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowAttachDatasetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.attach_dataset",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.block.add",
        "command_path": "workflow block add",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowBlockAddResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddSkeletonBlock",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockAddResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_add",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.block.auth",
        "command_path": "workflow block auth",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowBlockAuthResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/auth",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PatchBlockAuth",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockAuthResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_auth",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.block.config",
        "command_path": "workflow block config",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowBlockConfigResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/config",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PromoteSkeletonBlock",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockConfigResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_config",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.block.type",
        "command_path": "workflow block type",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowBlockTypeResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/type",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "PatchBlockType",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockTypeResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_type",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.canvas",
        "command_path": "workflow canvas",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Proposes changes to a workflow for the user to review and Save on the Workflows canvas; nothing is built until they Save, and Save builds every change in flow order. Use it when the user asks to suggest, sketch or draft a workflow, or wants to review first. Steps inside a view are changes too: propose the filters, calculations and other tasks a proposed or existing view needs as add_step changes in the same call, never as view commands run afterwards. WORKFLOW_ID is the workflow's record id (URL id w12 is record 12); an unnamed workflow has none, so name it first with workflow create --seed_datasource_id. Input: {\"canvas_state\": {\"proposed_changes\": [...]}}, each change one of (integer ids from workflow graph): {op: add_view, dataset_id, name, ref?}; {op: rename_view, dataset_id, view_id, name}; {op: trash_view, dataset_id, view_id}; {op: rename_dataset, dataset_id, name}; {op: trash_dataset, dataset_id}; {op: send_to_new_dataset, dataset_id, view_id, name, ref?}; {op: send_to_dataset, dataset_id, view_id, target_dataset_id}; {op: join, dataset_id, view_id, with_dataset_id, with_view_id, join_type?, on?, select?, column_prefix?} (with join_type INNER|LEFT|RIGHT|OUTER, on [{left, right}] and select [columns], Save builds the join); {op: export, dataset_id, view_id, connector?, destination?, connection_id?, settings?} (an existing connection and the destination's settings, never a credential); {op: add_source, name, dataset_name, ref?, kind?, url?, connector?, connection_id?, settings?} (kind url with a link, or connection with an existing connection; with neither it waits for the user's data); {op: lookup, view_id, lookup_view_id, key, source, value, new_column?, label?, ref?}; {op: add_step, view_id, transform, params, label, after_ref?, ref?} (transform is a view transform kind such as filter, discard-duplicates or sort, and params is exactly that command's --input: schema get view.transform.<kind>; after_ref names an earlier add_step on the same view); {op: update_step, view_id, task_id, params, label?}; {op: remove_step, view_id, task_id}. A later change in the same call can point at something an earlier one proposes: give the earlier change a ref, then use view_ref, dataset_ref or target_dataset_ref in place of the id (an add_step on a proposed view uses view_ref) (a new dataset's ref also names its first view), so a whole shape is proposed in one call. A step is checked when proposed; a refused one says how to fix it. Join, export and complex steps (join, lookup, ai, add-sql, generate-sql, pivot, crosstab, window, unnest) arrive needing setup in the Data Editor. Tell the user the changes wait on the canvas for their review.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowCanvasResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/canvas",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateCanvasState",
        "pagination_policy": "none",
        "preconditions": "Proposes changes to a workflow for the user to review and Save on the Workflows canvas; nothing is built until they Save, and Save builds every change in flow order. Use it when the user asks to suggest, sketch or draft a workflow, or wants to review first. Steps inside a view are changes too: propose the filters, calculations and other tasks a proposed or existing view needs as add_step changes in the same call, never as view commands run afterwards. WORKFLOW_ID is the workflow's record id (URL id w12 is record 12); an unnamed workflow has none, so name it first with workflow create --seed_datasource_id. Input: {\"canvas_state\": {\"proposed_changes\": [...]}}, each change one of (integer ids from workflow graph): {op: add_view, dataset_id, name, ref?}; {op: rename_view, dataset_id, view_id, name}; {op: trash_view, dataset_id, view_id}; {op: rename_dataset, dataset_id, name}; {op: trash_dataset, dataset_id}; {op: send_to_new_dataset, dataset_id, view_id, name, ref?}; {op: send_to_dataset, dataset_id, view_id, target_dataset_id}; {op: join, dataset_id, view_id, with_dataset_id, with_view_id, join_type?, on?, select?, column_prefix?} (with join_type INNER|LEFT|RIGHT|OUTER, on [{left, right}] and select [columns], Save builds the join); {op: export, dataset_id, view_id, connector?, destination?, connection_id?, settings?} (an existing connection and the destination's settings, never a credential); {op: add_source, name, dataset_name, ref?, kind?, url?, connector?, connection_id?, settings?} (kind url with a link, or connection with an existing connection; with neither it waits for the user's data); {op: lookup, view_id, lookup_view_id, key, source, value, new_column?, label?, ref?}; {op: add_step, view_id, transform, params, label, after_ref?, ref?} (transform is a view transform kind such as filter, discard-duplicates or sort, and params is exactly that command's --input: schema get view.transform.<kind>; after_ref names an earlier add_step on the same view); {op: update_step, view_id, task_id, params, label?}; {op: remove_step, view_id, task_id}. A later change in the same call can point at something an earlier one proposes: give the earlier change a ref, then use view_ref, dataset_ref or target_dataset_ref in place of the id (an add_step on a proposed view uses view_ref) (a new dataset's ref also names its first view), so a whole shape is proposed in one call. A step is checked when proposed; a refused one says how to fix it. Join, export and complex steps (join, lookup, ai, add-sql, generate-sql, pivot, crosstab, window, unnest) arrive needing setup in the Data Editor. Tell the user the changes wait on the canvas for their review.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCanvasResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.canvas",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.cleanup",
        "command_path": "workflow cleanup",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes the active project's ghost (orphaned, half-created) workflows for good; real workflows are untouched. Needs --project or an active project, and a prompt or --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowCleanupResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/cleanup",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "CleanupGhostWorkflows",
        "pagination_policy": "none",
        "preconditions": "Deletes the active project's ghost (orphaned, half-created) workflows for good; real workflows are untouched. Needs --project or an active project, and a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCleanupResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.cleanup",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.create",
        "command_path": "workflow create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "With seed_datasource_id set to a workflow's root dataset id (workflow graph lists each workflow's datasets), names that existing unnamed workflow and returns its record id; without it, starts a new empty workflow.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowCreateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateWorkflow",
        "pagination_policy": "none",
        "preconditions": "With seed_datasource_id set to a workflow's root dataset id (workflow graph lists each workflow's datasets), names that existing unnamed workflow and returns its record id; without it, starts a new empty workflow.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCreateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.delete",
        "command_path": "workflow delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowDeleteResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "DeleteWorkflow",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowDeleteResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "always_wait",
        "canonical_command": "workflow.duplicate",
        "command_path": "workflow duplicate",
        "confirmation": "none",
        "contract": {
          "async": "always_wait",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Copies the chosen datasets, with their rows, views and steps, into a new workflow. Automations and outside exports are not copied.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowDuplicateResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/duplicate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "DuplicateWorkflow",
        "pagination_policy": "none",
        "preconditions": "Copies the chosen datasets, with their rows, views and steps, into a new workflow. Automations and outside exports are not copied.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowDuplicateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.duplicate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.from-template",
        "command_path": "workflow from-template",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: TEMPLATE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowFromTemplateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/from-template",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "InstantiateFromTemplate",
        "pagination_policy": "none",
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowFromTemplateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.from_template",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.get",
        "command_path": "workflow get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: WORKFLOW_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkflow",
        "pagination_policy": "none",
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowGetResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.graph",
        "command_path": "workflow graph",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowGraphResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/graph",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetProjectWorkflowGraph",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowGraphResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.graph",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.list",
        "command_path": "workflow list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkflows",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowListResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workflow.resolve-held",
        "command_path": "workflow resolve-held",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Takes the change's key as the second positional, KEY. Input: {built: true|false (true: already in Mammoth, not built again; false: lift the hold so the next Save builds it), expected_version?: int}.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowResolveHeldResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/held/resolve",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "ResolveHeldChange",
        "pagination_policy": "none",
        "preconditions": "Takes the change's key as the second positional, KEY. Input: {built: true|false (true: already in Mammoth, not built again; false: lift the hold so the next Save builds it), expected_version?: int}.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowResolveHeldResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.resolve_held",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workflow.save",
        "command_path": "workflow save",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input (optional): {keys?: [change keys to save], expected_version?: int}. Omitted keys save every unsaved change; a stale expected_version fails with 409.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowSaveResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "SaveWorkflow",
        "pagination_policy": "none",
        "preconditions": "Input (optional): {keys?: [change keys to save], expected_version?: int}. Omitted keys save every unsaved change; a stale expected_version fails with 409.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.save",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workflow.save-cancel-step",
        "command_path": "workflow save-cancel-step",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Cancels one step of a running Save; steps that need it are skipped. Best effort: a job already started may still finish.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowSaveCancelStepResult",
          "scope": "project",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save/{run_id}/steps/{step}/cancel",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CancelWorkflowSaveStep",
        "pagination_policy": "none",
        "preconditions": "Cancels one step of a running Save; steps that need it are skipped. Best effort: a job already started may still finish.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveCancelStepResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.cancel_save_step",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "always_wait",
        "canonical_command": "workflow.save-undo",
        "command_path": "workflow save-undo",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "always_wait",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes what the Save built (datasets, views, steps). Prompts, or pass --yes. Waits for the undo run.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowSaveUndoResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save/{run_id}/undo",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "UndoWorkflowSave",
        "pagination_policy": "none",
        "preconditions": "Removes what the Save built (datasets, views, steps). Prompts, or pass --yes. Waits for the undo run.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveUndoResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.undo_save",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "always_wait"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.build",
        "command_path": "workflow template build",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {inputs, matches, destination_name, settings?, destination_emails?} as in workflow template preview; the server refuses a build whose own preview could not run. Answers while the Save runs: follow it with workflow get WORKFLOW_ID (canvas_state.save_run).",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkflowTemplateBuildResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Input: {inputs, matches, destination_name, settings?, destination_emails?} as in workflow template preview; the server refuses a build whose own preview could not run. Answers while the Save runs: follow it with workflow get WORKFLOW_ID (canvas_state.save_run).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkflowTemplateBuildResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.fit",
        "command_path": "workflow template fit",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}}. Read-only; the matches it proposes go into the preview and build inputs.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplateFitResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}}. Read-only; the matches it proposes go into the preview and build inputs.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateFitResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.get",
        "command_path": "workflow template get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only: the inputs, roles and settings the other template commands take.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplateGetResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Read-only: the inputs, roles and settings the other template commands take.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateGetResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.list",
        "command_path": "workflow template list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists the project workflow-template catalog (ready-made reconciliations and reports), not the workspace templates of 'template list'. Pick a key, then run workflow template get KEY.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplateListResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Lists the project workflow-template catalog (ready-made reconciliations and reports), not the workspace templates of 'template list'. Pick a key, then run workflow template get KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateListResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.preview",
        "command_path": "workflow template preview",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}, matches: {INPUT_KEY: {ROLE_KEY: {column: NAME}}}, settings?: {}}. Read-only: runs the template on the first rows of your tables.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplatePreviewResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}, matches: {INPUT_KEY: {ROLE_KEY: {column: NAME}}}, settings?: {}}. Read-only: runs the template on the first rows of your tables.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplatePreviewResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.rank",
        "command_path": "workflow template rank",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Input: {input_key: INPUT_KEY, dataset_ids: [1 to 200 dataset ids]}. Judges each table from its column names and types alone, so it reads no rows.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplateRankResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Input: {input_key: INPUT_KEY, dataset_ids: [1 to 200 dataset ids]}. Judges each table from its column names and types alone, so it reads no rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateRankResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.sample-result",
        "command_path": "workflow template sample-result",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Computed in memory on the template's own sample rows; nothing is imported.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowTemplateSampleResultResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Computed in memory on the template's own sample rows; nothing is imported.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateSampleResultResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workflow.template.samples",
        "command_path": "workflow template samples",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Imports the template's sample tables into the project, once, so the template can be tried without your own data.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkflowTemplateSamplesResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Imports the template's sample tables into the project, once, so the template can be tried without your own data.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkflowTemplateSamplesResult",
        "scope": "project",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_disposable_project",
        "async": "not_async",
        "canonical_command": "workflow.update",
        "command_path": "workflow update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "WORKFLOW_ID is the workflow's record id: URL id w12 is record 12. An unnamed workflow (base64 URL id) has no record; name it with workflow create --seed_datasource_id <its root dataset id> instead.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkflowUpdateResult",
          "scope": "project",
          "verification": "live_disposable_project"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateWorkflow",
        "pagination_policy": "none",
        "preconditions": "WORKFLOW_ID is the workflow's record id: URL id w12 is record 12. An unnamed workflow (base64 URL id) has no record; name it with workflow create --seed_datasource_id <its root dataset id> instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowUpdateResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_disposable_project",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.workspace-datasets",
        "command_path": "workflow workspace-datasets",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowWorkspaceDatasetsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-datasets",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceDatasets",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceDatasetsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_datasets",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.workspace-exports",
        "command_path": "workflow workspace-exports",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowWorkspaceExportsResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-exports",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceExports",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceExportsResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_exports",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workflow.workspace-sources",
        "command_path": "workflow workspace-sources",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkflowWorkspaceSourcesResult",
          "scope": "project",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-sources",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListWorkspaceSources",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceSourcesResult",
        "scope": "project",
        "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_sources",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      }
    ],
    "workspace": [
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.accept-invite",
        "command_path": "workspace accept-invite",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceAcceptInviteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /accept-invite",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AcceptInvite",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceAcceptInviteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.accept_invite",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.app-usage",
        "command_path": "workspace app-usage",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceAppUsageResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/app-usage",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetAppUsage",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceAppUsageResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.app_usage",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.check-expression",
        "command_path": "workspace check-expression",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceCheckExpressionResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/ai/check-expression",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "GenerateCheckExpression",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceCheckExpressionResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.check_expression",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.create",
        "command_path": "workspace create",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "CreateWorkspace",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workspace.current",
        "command_path": "workspace current",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The workspace this token acts in, and the server (resource) and project it is fenced to.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceCurrentResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/current",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetCurrentWorkspace",
        "pagination_policy": "none",
        "preconditions": "Read-only. The workspace this token acts in, and the server (resource) and project it is fenced to.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceCurrentResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.current",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.delete",
        "command_path": "workspace delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact immutable workspace-ID confirmation, not --yes alone.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteUserWorkspace",
        "pagination_policy": "none",
        "preconditions": "Exact immutable workspace-ID confirmation, not --yes alone.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.export-hosts.get",
        "command_path": "workspace export-hosts get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceExportHostsGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/export-hosts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "Read",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceExportHostsGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.export_hosts",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.export-hosts.set",
        "command_path": "workspace export-hosts set",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sets which hosts exports may send data to for the whole workspace. Admins only. Needs --yes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceExportHostsSetResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PUT /workspaces/{workspace_id}/export-hosts",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "Update",
        "pagination_policy": "none",
        "preconditions": "Sets which hosts exports may send data to for the whole workspace. Admins only. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceExportHostsSetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.exports.ExportsAPI.set_export_hosts",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.get",
        "command_path": "workspace get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspace",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceGetResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.get",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.home",
        "command_path": "workspace home",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "The Home read: usage_summary (storage, plan), health_issues (type, severity, occurrence_count, available_actions) and suggestions. Read-only; not a chat turn.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceHomeResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/home",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetHomeSummary",
        "pagination_policy": "none",
        "preconditions": "The Home read: usage_summary (storage, plan), health_issues (type, severity, occurrence_count, available_actions) and suggestions. Read-only; not a chat turn.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceHomeResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.home_summary",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.invite.delete",
        "command_path": "workspace invite delete",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Deletes pending invites for good and frees their seats. Take invite_ids from workspace invite list (a pending invite is not a workspace user; workspace user list never shows it).",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkspaceInviteDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Deletes pending invites for good and frees their seats. Take invite_ids from workspace invite list (a pending invite is not a workspace user; workspace user list never shows it).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteDeleteResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.invite.list",
        "command_path": "workspace invite list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Lists pending invites with id, email, status, role and invited_at. Optional project_id keeps invites that grant a role on that project.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceInviteListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Lists pending invites with id, email, status, role and invited_at. Optional project_id keeps invites that grant a role on that project.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceInviteListResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.invite.resend",
        "command_path": "workspace invite resend",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Sends the invitation email again. Take invite_ids from workspace invite list.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkspaceInviteResendResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Sends the invitation email again. Take invite_ids from workspace invite list.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteResendResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.invite.revoke",
        "command_path": "workspace invite revoke",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Marks pending invites revoked; the row stays. To remove an invite for good use workspace invite delete.",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkspaceInviteRevokeResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Marks pending invites revoked; the row stays. To remove an invite for good use workspace invite delete.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteRevokeResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.invite.update-role",
        "command_path": "workspace invite update-role",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes the workspace role a pending invite will grant (workspace_member, workspace_admin, workspace_owner, workspace_guest).",
          "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
          "result": "WorkspaceInviteUpdateRoleResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Changes the workspace role a pending invite will grant (workspace_member, workspace_admin, workspace_owner, workspace_guest).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteUpdateRoleResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.list",
        "command_path": "workspace list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetWorkspaces",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.llm-task",
        "command_path": "workspace llm-task",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceLlmTaskResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/llm",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "RunLlmTask",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceLlmTaskResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.llm_task",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.oauth-client.create",
        "command_path": "workspace oauth-client create",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Registers an OAuth client that can sign users in. A confidential client's client_secret is returned exactly once and shown once in this output; store it now, it cannot be fetched again. Send name and redirect_uris through --input.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceOauthClientCreateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/oauth-clients",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "CreateOauthClient",
        "pagination_policy": "none",
        "preconditions": "Registers an OAuth client that can sign users in. A confidential client's client_secret is returned exactly once and shown once in this output; store it now, it cannot be fetched again. Send name and redirect_uris through --input.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientCreateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.create",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.oauth-client.delete",
        "command_path": "workspace oauth-client delete",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Deleting the client stops its grants working.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceOauthClientDeleteResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/oauth-clients/{oauth_client_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "DeleteOauthClient",
        "pagination_policy": "none",
        "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Deleting the client stops its grants working.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientDeleteResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.delete",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_no_disposable_fixture",
        "async": "not_async",
        "canonical_command": "workspace.oauth-client.list",
        "command_path": "workspace oauth-client list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Read-only. The workspace's OAuth clients (id, client_id, name, redirect URIs). No client secret is returned.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "AuthOauthClientListResult",
          "scope": "workspace",
          "verification": "contract_only_no_disposable_fixture"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/oauth-clients",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "ListOauthClients",
        "pagination_policy": "none",
        "preconditions": "Read-only. The workspace's OAuth clients (id, client_id, name, redirect URIs). No client secret is returned.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthOauthClientListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_no_disposable_fixture",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.oauth-client.revoke-grant",
        "command_path": "workspace oauth-client revoke-grant",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Every user who authorised this client must authorise it again.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceOauthClientRevokeGrantResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "DELETE /workspaces/{workspace_id}/oauth-clients/{oauth_client_id}/grant",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "RevokeOauthGrant",
        "pagination_policy": "none",
        "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Every user who authorised this client must authorise it again.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientRevokeGrantResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.revoke_grant",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.reactivate",
        "command_path": "workspace reactivate",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Turns a deactivated workspace back on; its users regain access and billing resumes. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceReactivateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "POST /workspaces/{workspace_id}/reactivate",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "ReactivateWorkspace",
        "pagination_policy": "none",
        "preconditions": "Turns a deactivated workspace back on; its users regain access and billing resumes. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceReactivateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.reactivate",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.segment.list",
        "command_path": "workspace segment list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": null,
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceSegmentListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/split-segments",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetSegments",
        "pagination_policy": "single_page",
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceSegmentListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.segment_list",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.segment.update",
        "command_path": "workspace segment update",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceSegmentUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "PATCH /workspaces/{workspace_id}/split-segments",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "UpdateSegments",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceSegmentUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.segment_update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.storage-breakdown",
        "command_path": "workspace storage-breakdown",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "This is a paginated per-item list of storage-consuming resources (limit/offset); it carries no workspace total and can page through thousands of items. For the workspace's total storage used/allowed, use `workspace app-usage` instead.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceStorageBreakdownResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/storage-breakdown",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": "GetStorageBreakdown",
        "pagination_policy": "none",
        "preconditions": "This is a paginated per-item list of storage-consuming resources (limit/offset); it carries no workspace total and can page through thousands of items. For the workspace's total storage used/allowed, use `workspace app-usage` instead.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceStorageBreakdownResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.storage_breakdown",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.update",
        "command_path": "workspace update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Patches workspace settings that apply to every member. Read them first (`workspace get`). Needs --yes and --confirm WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateWorkspace",
        "pagination_policy": "none",
        "preconditions": "Patches workspace settings that apply to every member. Read them first (`workspace get`). Needs --yes and --confirm WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.update",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.user.add",
        "command_path": "workspace user add",
        "confirmation": "yes_always",
        "contract": {
          "async": "not_async",
          "effects": "benign_mutation",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": null,
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUserAddResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "benign_mutation",
        "identity": "POST /workspaces/{workspace_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "benign_mutation",
        "operation_id": "AddUserInWorkspace",
        "pagination_policy": "none",
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserAddResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_add",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": null,
        "async": "not_async",
        "canonical_command": "workspace.user.get",
        "command_path": "workspace user get",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: USER_ID.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceUserGetResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": null,
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "read",
        "operation_id": null,
        "pagination_policy": "none",
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceUserGetResult",
        "scope": "workspace",
        "sdk_symbol": null,
        "source": "schema list",
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "live_read_only",
        "async": "not_async",
        "canonical_command": "workspace.user.list",
        "command_path": "workspace user list",
        "confirmation": "none",
        "contract": {
          "async": "not_async",
          "effects": "read",
          "limits": {
            "continuation": "not_proven",
            "pagination": "single_page"
          },
          "preconditions": "Lists members only; a pending invite is not a member. For pending invites and their ids run workspace invite list. Optional project_id keeps one project's members.",
          "recovery": "Rerun only after checking the exit code and stable error code.",
          "result": "WorkspaceUserListResult",
          "scope": "workspace",
          "verification": "live_read_only"
        },
        "disposition": "command",
        "effects": "read",
        "identity": "GET /workspaces/{workspace_id}/users",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "mutation_class": "read",
        "operation_id": "GetUsersInWorkspace",
        "pagination_policy": "single_page",
        "preconditions": "Lists members only; a pending invite is not a member. For pending invites and their ids run workspace invite list. Optional project_id keeps one project's members.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceUserListResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.list_users",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "live_read_only",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.user.remove",
        "command_path": "workspace user remove",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Required inputs: USER_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUserRemoveResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/users/{user_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "RemoveUser",
        "pagination_policy": "none",
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserRemoveResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_remove",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.user.remove-batch",
        "command_path": "workspace user remove-batch",
        "confirmation": "prompt_or_yes",
        "contract": {
          "async": "not_async",
          "effects": "destructive",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Removes members (ids) and/or pending invites (invite_ids). Take invite ids from workspace invite list; workspace invite delete is the dedicated command for invites.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUserRemoveBatchResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "destructive",
        "identity": "DELETE /workspaces/{workspace_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "destructive",
        "operation_id": "RemoveUserFromWorkspace",
        "pagination_policy": "none",
        "preconditions": "Removes members (ids) and/or pending invites (invite_ids). Take invite ids from workspace invite list; workspace invite delete is the dedicated command for invites.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserRemoveBatchResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_remove_batch",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.user.update",
        "command_path": "workspace user update",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Exact user-ID confirmation for owner/admin role changes.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUserUpdateResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/users/{user_id}",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateUserInWorkspace",
        "pagination_policy": "none",
        "preconditions": "Exact user-ID confirmation for owner/admin role changes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserUpdateResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.update_user",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      },
      {
        "acceptance_evidence": "contract_only_high_impact",
        "async": "not_async",
        "canonical_command": "workspace.user.update-batch",
        "command_path": "workspace user update-batch",
        "confirmation": "confirm_target",
        "contract": {
          "async": "not_async",
          "effects": "high_impact",
          "limits": {
            "continuation": null,
            "pagination": "none"
          },
          "preconditions": "Changes the roles of several workspace users in one JSON-patch call; each gains or loses access at once. Read `workspace user list` first. Needs --yes and --confirm WORKSPACE_ID.",
          "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
          "result": "WorkspaceUserUpdateBatchResult",
          "scope": "workspace",
          "verification": "contract_only_high_impact"
        },
        "disposition": "command",
        "effects": "high_impact",
        "identity": "PATCH /workspaces/{workspace_id}/users",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "mutation_class": "high_impact",
        "operation_id": "UpdateUserToWorkspace",
        "pagination_policy": "none",
        "preconditions": "Changes the roles of several workspace users in one JSON-patch call; each gains or loses access at once. Read `workspace user list` first. Needs --yes and --confirm WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserUpdateBatchResult",
        "scope": "workspace",
        "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_update_batch",
        "server_status": "served",
        "source": "capability list",
        "unavailable": false,
        "verification": "contract_only_high_impact",
        "wait_policy": "not_async"
      }
    ]
  },
  "rows": [
    {
      "acceptance_evidence": "live_read_only",
      "async": "returns_job",
      "canonical_command": "activity.export",
      "command_path": "activity export",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B19 ACTIVITY_EXPORT_UNTYPED_ASYNC]: format/filters/download response are raw; reserved, not registered.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ActivityExportResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/activity_log/export",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ExportActivityLogs",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B19 ACTIVITY_EXPORT_UNTYPED_ASYNC]: format/filters/download response are raw; reserved, not registered.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ActivityExportResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.activity_logs.ActivityLogsAPI.export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "activity.list",
      "command_path": "activity list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ActivityListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/activity_log",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetActivityLogs",
      "pagination_policy": "offset",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ActivityListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.activity_logs.ActivityLogsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.connector.add",
      "command_path": "addon connector add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds paid connector add-ons to the workspace and changes its bill. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonConnectorAddResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/addons/connectors",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddConnectorAddon",
      "pagination_policy": "none",
      "preconditions": "Adds paid connector add-ons to the workspace and changes its bill. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonConnectorAddResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_connector",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.connector.remove",
      "command_path": "addon connector remove",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes paid connector add-ons from the workspace; connections that use them stop working. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonConnectorRemoveResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/addons/connectors",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RemoveConnectorAddon",
      "pagination_policy": "none",
      "preconditions": "Removes paid connector add-ons from the workspace; connections that use them stop working. Pass connector_id or connector_ids. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonConnectorRemoveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_connector",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.storage.add",
      "command_path": "addon storage add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds paid storage to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonStorageAddResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/addons/storage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddStorageAddon",
      "pagination_policy": "none",
      "preconditions": "Adds paid storage to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonStorageAddResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_storage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.storage.remove",
      "command_path": "addon storage remove",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes paid storage from the workspace; it fails or data becomes read-only if usage exceeds what is left. Check `workspace storage-breakdown` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonStorageRemoveResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/addons/storage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RemoveStorageAddon",
      "pagination_policy": "none",
      "preconditions": "Removes paid storage from the workspace; it fails or data becomes read-only if usage exceeds what is left. Check `workspace storage-breakdown` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonStorageRemoveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_storage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.user.add",
      "command_path": "addon user add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds paid user seats to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonUserAddResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/addons/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddUserSeatsAddon",
      "pagination_policy": "none",
      "preconditions": "Adds paid user seats to the workspace and changes its bill. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonUserAddResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.add_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "addon.user.remove",
      "command_path": "addon user remove",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes paid user seats; fails if more users than seats would remain. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AddonUserRemoveResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/addons/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RemoveUserSeatsAddon",
      "pagination_policy": "none",
      "preconditions": "Removes paid user seats; fails if more users than seats would remain. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AddonUserRemoveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.addons.AddonsAPI.remove_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.askers",
      "command_path": "agent access askers",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs a manager of the workspace's AI Agent settings, or someone who manages the project's people. Returns a count.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessAskersResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/projects/{project_id}/askers",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentProjectAskers",
      "pagination_policy": "none",
      "preconditions": "Needs a manager of the workspace's AI Agent settings, or someone who manages the project's people. Returns a count.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessAskersResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_project_askers",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.chart.save",
      "command_path": "agent access chart save",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessChartSaveResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/access/saved-charts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SaveAgentChart",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessChartSaveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_chart_save",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "agent.access.grant.give",
      "command_path": "agent access grant give",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can give access. People outside the workspace are invited as free guests. Needs --yes. Read `agent access grant list` afterwards.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantGiveResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /agents/access/grants",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "GiveAgentAccess",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can give access. People outside the workspace are invited as free guests. Needs --yes. Read `agent access grant list` afterwards.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessGrantGiveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_give",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.grant.list",
      "command_path": "agent access grant list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can list grants.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessGrantListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/grants",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentGrants",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can list grants.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessGrantListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grants_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.grant.revoke",
      "command_path": "agent access grant revoke",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can revoke. Removes the grant at once; the person loses the access. Prompts, or pass --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantRevokeResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /agents/access/grants/{grant_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "RevokeAgentAccess",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can revoke. Removes the grant at once; the person loses the access. Prompts, or pass --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessGrantRevokeResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_revoke",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.grant.update",
      "command_path": "agent access grant update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can change a grant.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessGrantUpdateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /agents/access/grants/{grant_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ChangeAgentAccess",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can change a grant.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessGrantUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_grant_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.me",
      "command_path": "agent access me",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessMeResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/me",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentAccessMe",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessMeResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_me",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.people",
      "command_path": "agent access people",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can list the people.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessPeopleResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/people",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentPeople",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can list the people.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessPeopleResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_people",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.reach",
      "command_path": "agent access reach",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Anyone reads their own; another person's (user_id) is for managers of the AI Agent settings only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessReachResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/reach",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentAccessReach",
      "pagination_policy": "none",
      "preconditions": "Anyone reads their own; another person's (user_id) is for managers of the AI Agent settings only.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessReachResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_reach",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.request.add-to-context",
      "command_path": "agent access request add-to-context",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: REQUEST_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestAddToContextResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/access/requests/{request_id}/project-context",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddAgentRequestToProjectContext",
      "pagination_policy": "none",
      "preconditions": "Required inputs: REQUEST_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessRequestAddToContextResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_add_to_context",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.request.create",
      "command_path": "agent access request create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestCreateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/access/requests",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateAgentAccessRequest",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessRequestCreateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.request.list",
      "command_path": "agent access request list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can list everyone's requests; `agent access request mine` lists your own.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessRequestListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/requests",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentAccessRequests",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can list everyone's requests; `agent access request mine` lists your own.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessRequestListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_requests_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.request.mine",
      "command_path": "agent access request mine",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessRequestMineResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/requests/mine",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListMyAgentAccessRequests",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessRequestMineResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_requests_mine",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.access.request.resolve",
      "command_path": "agent access request resolve",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Irreversible: a resolved request cannot be reopened, and the requester is told. status is done, declined or dismissed ('open' is refused). Prompts, or pass --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessRequestResolveResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "PATCH /agents/access/requests/{request_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "ResolveAgentAccessRequest",
      "pagination_policy": "none",
      "preconditions": "Irreversible: a resolved request cannot be reopened, and the requester is told. status is done, declined or dismissed ('open' is refused). Prompts, or pass --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessRequestResolveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_request_resolve",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.settings.get",
      "command_path": "agent access settings get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can read them.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessSettingsGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentSettings",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can read them.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessSettingsGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_settings_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "agent.access.settings.update",
      "command_path": "agent access settings update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can change them. Changes the AI agent for the whole workspace, not one project; only the fields given change. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target). --dry-run reads the current settings and shows each field going from its current to its new value.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentAccessSettingsUpdateResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /agents/access/settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateAgentSettings",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can change them. Changes the AI agent for the whole workspace, not one project; only the fields given change. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target). --dry-run reads the current settings and shows each field going from its current to its new value.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentAccessSettingsUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_settings_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.access.tree",
      "command_path": "agent access tree",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only a manager of the workspace's AI Agent settings can read the tree.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentAccessTreeResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/access/tree",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentAccessTree",
      "pagination_policy": "none",
      "preconditions": "Only a manager of the workspace's AI Agent settings can read the tree.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentAccessTreeResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.access_tree",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.action.delete",
      "command_path": "agent action delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Deletes the object one recorded action made. The server deletes only an object the chat created (created=true in agent action list), refuses an object the chat only edited or that another object now uses, and re-checks your permission on it. The object goes to the trash, so it can be restored. Prompt or --yes. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentActionDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /agents/sessions/{session_id}/actions/{action_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteAgentSessionAction",
      "pagination_policy": "none",
      "preconditions": "Writes. Deletes the object one recorded action made. The server deletes only an object the chat created (created=true in agent action list), refuses an object the chat only edited or that another object now uses, and re-checks your permission on it. The object goes to the trash, so it can be restored. Prompt or --yes. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentActionDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.action_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.action.list",
      "command_path": "agent action list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists every change the chat session made through the CLI (one row per write: action id, run and step, command, target object, whether the chat created the object, and its state after the write). Read it before agent action delete. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentActionListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/actions",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentSessionActions",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists every change the chat session made through the CLI (one row per write: action id, run and step, command, target object, whether the chat created the object, and its state after the write). Read it before agent action delete. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentActionListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.action_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.chat",
      "command_path": "agent chat",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Scope is {\"type\": \"workspace\", \"workspace_id\": N}, {\"type\": \"user\", \"user_id\": N} or {\"type\": \"account\"}. Put the project the question is about in client_context as {\"project_id\": N}. The command starts the turn and waits for the reply, up to 120 seconds: pass \"wait\": 0 to return at once with the turn id, or a larger \"wait\" for a long turn. If the wait ends first the result has working: true; read the finished reply with agent session messages SESSION_ID. The CLI sends one idempotency key per message and repeats it on a gateway error, so a retry never starts a second turn.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentChatResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AgentChat",
      "pagination_policy": "none",
      "preconditions": "Scope is {\"type\": \"workspace\", \"workspace_id\": N}, {\"type\": \"user\", \"user_id\": N} or {\"type\": \"account\"}. Put the project the question is about in client_context as {\"project_id\": N}. The command starts the turn and waits for the reply, up to 120 seconds: pass \"wait\": 0 to return at once with the turn id, or a larger \"wait\" for a long turn. If the wait ends first the result has working: true; read the finished reply with agent session messages SESSION_ID. The CLI sends one idempotency key per message and repeats it on a gateway error, so a retry never starts a second turn.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentChatResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.chat",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "agent.message.set-request-kind",
      "command_path": "agent message set-request-kind",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Corrects the request kind a reply answered (ask, insight, build, automate or fix). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentMessageSetRequestKindResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /agents/sessions/{session_id}/messages/{message_id}/request-kind",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CorrectAgentRequestKind",
      "pagination_policy": "none",
      "preconditions": "Writes. Corrects the request kind a reply answered (ask, insight, build, automate or fix). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentMessageSetRequestKindResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.message_set_request_kind",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "agent.plan.approve",
      "command_path": "agent plan approve",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. This is the web app's Run it: it approves every proposed step of the chat's current plan and starts the work (paid model work). Typing 'Run it' as a chat message does not approve. The plan_id is read from the session; the request key is made by the CLI. Prompt or --yes. Waits up to wait seconds (default 120; wait 0 returns at once) for the turn. A user control: an embedded chat is refused. agent session messages shows when a chat waits for approval.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanApproveResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Writes. This is the web app's Run it: it approves every proposed step of the chat's current plan and starts the work (paid model work). Typing 'Run it' as a chat message does not approve. The plan_id is read from the session; the request key is made by the CLI. Prompt or --yes. Waits up to wait seconds (default 120; wait 0 returns at once) for the turn. A user control: an embedded chat is refused. agent session messages shows when a chat waits for approval.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "AgentPlanApproveResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "agent.plan.discard",
      "command_path": "agent plan discard",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Marks every proposed step of the chat's current plan skipped; it needs no model turn. The plan_id is read from the session. A user control: an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanDiscardResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Writes. Marks every proposed step of the chat's current plan skipped; it needs no model turn. The plan_id is read from the session. A user control: an embedded chat is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "AgentPlanDiscardResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "agent.plan.edit-proposal",
      "command_path": "agent plan edit-proposal",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Renames or removes one item of the plan's waiting workflow proposal (action rename or remove, the item key, and name for a rename). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentPlanEditProposalResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /agents/sessions/{session_id}/plan/proposal",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditAgentPlanProposal",
      "pagination_policy": "none",
      "preconditions": "Writes. Renames or removes one item of the plan's waiting workflow proposal (action rename or remove, the item key, and name for a rename). Creator only. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentPlanEditProposalResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.plan_edit_proposal",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "agent.plan.skip",
      "command_path": "agent plan skip",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Marks the proposed plan step N skipped; it needs no model turn. Only a proposed step can be skipped. The plan_id is read from the session. A user control: an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AgentPlanSkipResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Writes. Marks the proposed plan step N skipped; it needs no model turn. Only a proposed step can be skipped. The plan_id is read from the session. A user control: an embedded chat is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "AgentPlanSkipResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.run.extend",
      "command_path": "agent run extend",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Gives a capped run a fresh time budget (the 8 hour active-time cap). The server refuses extend when this command runs from inside the run itself: a run cannot extend itself, ask the user to extend it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunExtendResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/extend",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExtendAgentRun",
      "pagination_policy": "none",
      "preconditions": "Writes. Gives a capped run a fresh time budget (the 8 hour active-time cap). The server refuses extend when this command runs from inside the run itself: a run cannot extend itself, ask the user to extend it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunExtendResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_extend",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.instance.list",
      "command_path": "agent run instance list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists the agents of the run: the main agent, its workers and recon helpers, with the ids the instance commands take. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentRunInstances",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists the agents of the run: the main agent, its workers and recon helpers, with the ids the instance commands take. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunInstanceListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instances_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.instance.messages",
      "command_path": "agent run instance messages",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The messages one agent of the run sent or received. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceMessagesResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances/{instance_id}/messages",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentInstanceMessages",
      "pagination_policy": "none",
      "preconditions": "Read-only. The messages one agent of the run sent or received. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunInstanceMessagesResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instance_messages",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.instance.transcript",
      "command_path": "agent run instance transcript",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The model messages of one agent of the run, credentials redacted. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunInstanceTranscriptResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/instances/{instance_id}/transcript",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentInstanceTranscript",
      "pagination_policy": "none",
      "preconditions": "Read-only. The model messages of one agent of the run, credentials redacted. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunInstanceTranscriptResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_instance_transcript",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.list",
      "command_path": "agent run list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists the runs of the chat session, newest first, with the same fields as agent run status. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/runs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentSessionRuns",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists the runs of the chat session, newest first, with the same fields as agent run status. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.run.pause",
      "command_path": "agent run pause",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Pauses the run after its current call finishes; a waiting run pauses at once. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunPauseResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/pause",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PauseAgentRun",
      "pagination_policy": "none",
      "preconditions": "Writes. Pauses the run after its current call finishes; a waiting run pauses at once. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunPauseResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_pause",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.run.resume",
      "command_path": "agent run resume",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Resumes a paused run from where it stopped. The server refuses resume when this command runs from inside the run itself: a run cannot resume itself, ask the user to resume it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunResumeResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/resume",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ResumeAgentRun",
      "pagination_policy": "none",
      "preconditions": "Writes. Resumes a paused run from where it stopped. The server refuses resume when this command runs from inside the run itself: a run cannot resume itself, ask the user to resume it. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunResumeResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_resume",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "agent.run.retry",
      "command_path": "agent run retry",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Retries a failed or stopped run as a new run, which starts paid model work. Session owner only. Prompt or --yes. Needs --session SESSION_ID; an embedded chat is refused.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunRetryResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/retry",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RetryAgentRun",
      "pagination_policy": "none",
      "preconditions": "Writes. Retries a failed or stopped run as a new run, which starts paid model work. Session owner only. Prompt or --yes. Needs --session SESSION_ID; an embedded chat is refused.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunRetryResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_retry",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.status",
      "command_path": "agent run status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Shows the chat session's current durable run: run id, state (running, waiting, paused, capped, done, failed or stopped), the step it is on, what it waits for, and the active time used and left of its 8 hour budget (time spent waiting on you does not count). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunStatusResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/run",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentSessionRun",
      "pagination_policy": "none",
      "preconditions": "Read-only. Shows the chat session's current durable run: run id, state (running, waiting, paused, capped, done, failed or stopped), the step it is on, what it waits for, and the active time used and left of its 8 hour budget (time spent waiting on you does not count). Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunStatusResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_status",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.run.stop",
      "command_path": "agent run stop",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Stops the run and cancels its live step. A stopped run cannot be resumed. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunStopResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/stop",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "StopAgentRun",
      "pagination_policy": "none",
      "preconditions": "Writes. Stops the run and cancels its live step. A stopped run cannot be resumed. Returns the run after the request. Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunStopResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_stop",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.run.units.list",
      "command_path": "agent run units list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. One page of the units the run's steps do, optionally only one step (step), one state (queued, running, done, failed or skipped) or from an offset (cursor). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentRunUnitsListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/runs/{run_id}/units",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentRunUnits",
      "pagination_policy": "none",
      "preconditions": "Read-only. One page of the units the run's steps do, optionally only one step (step), one state (queued, running, done, failed or skipped) or from an offset (cursor). Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentRunUnitsListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_units_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.run.units.set",
      "command_path": "agent run units set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Reports once the objects a plan step will work on (kind is dataset, view and so on; 1 to 1000 units, each id with an optional name and project_id) so the run panel can list them and measure progress and the time left. A unit already listed is left as it is. Needs --session SESSION_ID; an embedded chat supplies it. The server, not the model, counts the units done and the time left.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentRunUnitsSetResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/runs/{run_id}/units",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RegisterAgentRunUnits",
      "pagination_policy": "none",
      "preconditions": "Writes. Reports once the objects a plan step will work on (kind is dataset, view and so on; 1 to 1000 units, each id with an optional name and project_id) so the run panel can list them and measure progress and the time left. A unit already listed is left as it is. Needs --session SESSION_ID; an embedded chat supplies it. The server, not the model, counts the units done and the time left.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentRunUnitsSetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.run_units_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.session.delete",
      "command_path": "agent session delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentSessionDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /agents/sessions/{session_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteAgentSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentSessionDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.session.feedback.list",
      "command_path": "agent session feedback list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionFeedbackListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/feedback",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentTurnFeedback",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentSessionFeedbackListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_feedback_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.session.list",
      "command_path": "agent session list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListAgentSessions",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentSessionListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "agent.session.messages",
      "command_path": "agent session messages",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AgentSessionMessagesResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /agents/sessions/{session_id}/messages",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAgentSessionMessages",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AgentSessionMessagesResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_messages",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.session.set-visibility",
      "command_path": "agent session set-visibility",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentSessionSetVisibilityResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /agents/sessions/{session_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetAgentSessionVisibility",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentSessionSetVisibilityResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.session_set_visibility",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "agent.turn.cancel",
      "command_path": "agent turn cancel",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes. Stops one turn of the chat session: no further model or tool call starts, the call running is cut, and the turn ends with a stopped event that lists the writes already made. Only the session's owner may; a repeat, or a call after the turn ended, answers the turn's state (stopping, stopped or ended). Needs --session SESSION_ID; an embedded chat supplies it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentTurnCancelResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/turns/{turn_id}/cancel",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CancelAgentTurn",
      "pagination_policy": "none",
      "preconditions": "Writes. Stops one turn of the chat session: no further model or tool call starts, the call running is cut, and the turn ends with a stopped event that lists the writes already made. Only the session's owner may; a repeat, or a call after the turn ended, answers the turn's state (stopping, stopped or ended). Needs --session SESSION_ID; an embedded chat supplies it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentTurnCancelResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_cancel",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "agent.turn.rate",
      "command_path": "agent turn rate",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AgentTurnRateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /agents/sessions/{session_id}/turns/{turn_id}/feedback",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RateAgentTurn",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID, TURN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AgentTurnRateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.agents.AgentsAPI.turn_rate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "ai.condition.generate",
      "command_path": "ai condition generate",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiConditionGenerateResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/condition",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GenerateCondition",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AiConditionGenerateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.ai.AIAPI.condition_generate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "ai.expression.generate",
      "command_path": "ai expression generate",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiExpressionGenerateResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/expression",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GenerateExpression",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AiExpressionGenerateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.ai.AIAPI.expression_generate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "start_or_wait",
      "canonical_command": "ai.retention.condition",
      "command_path": "ai retention condition",
      "confirmation": "none",
      "contract": {
        "async": "start_or_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires explicit project context. Mode generate may return a job-backed result; mode test follows the release response union and must not be assumed to synchronously return row counts.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AiRetentionConditionResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation/retention_policy",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RetentionCondition",
      "pagination_policy": "none",
      "preconditions": "Requires explicit project context. Mode generate may return a job-backed result; mode test follows the release response union and must not be assumed to synchronously return row counts.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AiRetentionConditionResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.ai.AIAPI.retention_condition",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "ai.sql.generate",
      "command_path": "ai sql generate",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Returns a query and metadata; differs from view transform generate-sql, which adds and executes a pipeline task. Do not infer addon availability from an authorization error.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiSqlGenerateResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sql_generation",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GenerateSql",
      "pagination_policy": "none",
      "preconditions": "Returns a query and metadata; differs from view transform generate-sql, which adds and executes a pipeline task. Do not infer addon availability from an authorization error.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AiSqlGenerateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.ai.AIAPI.generate_sql",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "ai.suggestion.list",
      "command_path": "ai suggestion list",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Body is the release UnifiedPromptSpec. suggestion_type is one of extract_text, add_condition, generate_task, apply_ai_template, dashboards, derivative_fuzzy_bucket and params follows that type (generate_task {prompt}; add_condition {prompt, sequence_number}; extract_text {column_name, sequence_number, prompt}). dataset_id/dataview_id scope the request.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AiSuggestionListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/suggestions",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AiSuggestions",
      "pagination_policy": "none",
      "preconditions": "Body is the release UnifiedPromptSpec. suggestion_type is one of extract_text, add_condition, generate_task, apply_ai_template, dashboards, derivative_fuzzy_bucket and params follows that type (generate_task {prompt}; add_condition {prompt, sequence_number}; extract_text {column_name, sequence_number, prompt}). dataset_id/dataview_id scope the request.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AiSuggestionListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.ai.AIAPI.get_suggestions",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "annotation.comment.add",
      "command_path": "annotation comment add",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationCommentAddResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}/comments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddComment",
      "pagination_policy": "none",
      "preconditions": "Required inputs: ANNOTATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AnnotationCommentAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.comment_add",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "annotation.create",
      "command_path": "annotation create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/annotations",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateAnnotation",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AnnotationCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "annotation.delete",
      "command_path": "annotation delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteAnnotation",
      "pagination_policy": "none",
      "preconditions": "Required inputs: ANNOTATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AnnotationDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "annotation.list",
      "command_path": "annotation list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AnnotationListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/annotations",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListAnnotations",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AnnotationListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "annotation.update",
      "command_path": "annotation update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: ANNOTATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AnnotationUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/annotations/{annotation_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PatchAnnotation",
      "pagination_policy": "none",
      "preconditions": "Required inputs: ANNOTATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AnnotationUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.annotations.AnnotationsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "auth.connected-apps.list",
      "command_path": "auth connected-apps list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The apps the signed-in user has authorised; each id is the grant id that auth connected-apps revoke takes.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthConnectedAppsListResult",
        "scope": "local",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /self/oauth-grants",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectedApps",
      "pagination_policy": "none",
      "preconditions": "Read-only. The apps the signed-in user has authorised; each id is the grant id that auth connected-apps revoke takes.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AuthConnectedAppsListResult",
      "scope": "local",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.connected_apps",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "auth.connected-apps.revoke",
      "command_path": "auth connected-apps revoke",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact grant-ID confirmation (--yes --confirm ID). Disconnects the app: its tokens stop working for this user.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AuthConnectedAppsRevokeResult",
        "scope": "local",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /self/oauth-grants/{oauth_grant_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RevokeConnectedApp",
      "pagination_policy": "none",
      "preconditions": "Exact grant-ID confirmation (--yes --confirm ID). Disconnects the app: its tokens stop working for this user.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AuthConnectedAppsRevokeResult",
      "scope": "local",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.revoke_connected_app",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "auth.login",
      "command_path": "auth login",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AuthLoginResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "AuthLoginResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "auth.logout",
      "command_path": "auth logout",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "AuthLogoutResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "AuthLogoutResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "auth.status",
      "command_path": "auth status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthStatusResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AuthStatusResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.capabilities",
      "command_path": "automation capabilities",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists everything an automation supports, straight from the server: tasks (each with task_type, summary, required_fields, optional_fields, options = accepted values per field, formats_in and formats_out = file formats it reads or writes) and conditions (the triggers: condition_type, summary, fields, options). Answer \"can an automation do X?\" (a PDF, an email attachment, a schedule) from this, never from memory. Then create with `automation create`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationCapabilitiesResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/capabilities",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAutomationCapabilities",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists everything an automation supports, straight from the server: tasks (each with task_type, summary, required_fields, optional_fields, options = accepted values per field, formats_in and formats_out = file formats it reads or writes) and conditions (the triggers: condition_type, summary, fields, options). Answer \"can an automation do X?\" (a PDF, an email attachment, a schedule) from this, never from memory. Then create with `automation create`.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationCapabilitiesResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.capabilities",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "automation.create",
      "command_path": "automation create",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "B15 AUTOMATION_EXTERNAL_EFFECTS: run `automation capabilities` first: it lists every task, trigger, option and file format in and out (PDF included). Task models can pull cloud files and send email; requires connector/email allowlists and dedicated fixtures. Delete old rows on a schedule with task apply_retention_policy (datasource_id, rule_type time_based, count_based or condition_based). The CLI sets require_approval=true on a retention task that omits it (the route defaults to false, an unattended hard delete); require_approval=false with the delete action needs --yes --confirm unattended-delete. An emailed file is task send_an_alert with attachments.dataview_ids: each selected view is emailed as a CSV file. The combined row count of all attached views must stay within 100,000 -- over that, the automation is refused (and a run that grows past it fails).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationCreateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "CreateAutomation",
      "pagination_policy": "none",
      "preconditions": "B15 AUTOMATION_EXTERNAL_EFFECTS: run `automation capabilities` first: it lists every task, trigger, option and file format in and out (PDF included). Task models can pull cloud files and send email; requires connector/email allowlists and dedicated fixtures. Delete old rows on a schedule with task apply_retention_policy (datasource_id, rule_type time_based, count_based or condition_based). The CLI sets require_approval=true on a retention task that omits it (the route defaults to false, an unattended hard delete); require_approval=false with the delete action needs --yes --confirm unattended-delete. An emailed file is task send_an_alert with attachments.dataview_ids: each selected view is emailed as a CSV file. The combined row count of all attached views must stay within 100,000 -- over that, the automation is refused (and a run that grows past it fails).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "automation.delete",
      "command_path": "automation delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteAutomation",
      "pagination_policy": "none",
      "preconditions": "Immutable ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.folders",
      "command_path": "automation folders",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Every folder a consolidation automation watches, its rules in order, and the files on their way or waiting on a person.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationFoldersResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/folders",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWatchedFolders",
      "pagination_policy": "none",
      "preconditions": "Read-only. Every folder a consolidation automation watches, its rules in order, and the files on their way or waiting on a person.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationFoldersResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.watched_folders",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.get",
      "command_path": "automation get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Some servers answer this with HTTP 500 and an empty body for an automation that automation create just returned. The automation exists; this is a server error, so do not retry more than once.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAutomation",
      "pagination_policy": "none",
      "preconditions": "Some servers answer this with HTTP 500 and an empty body for an automation that automation create just returned. The automation exists; this is a server error, so do not retry more than once.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.list",
      "command_path": "automation list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetList",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "automation.restore",
      "command_path": "automation restore",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: AUTOMATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRestoreResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RestoreAutomation",
      "pagination_policy": "none",
      "preconditions": "Required inputs: AUTOMATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationRestoreResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "automation.route.order",
      "command_path": "automation route order",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "`automation_ids` names the folder's own rules, first rule first; files dropped after the change meet them in that order.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRouteOrderResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /workspaces/{workspace_id}/projects/{project_id}/automations/route-order",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetRouteOrder",
      "pagination_policy": "none",
      "preconditions": "`automation_ids` names the folder's own rules, first rule first; files dropped after the change meet them in that order.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationRouteOrderResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.set_route_order",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.route.preview",
      "command_path": "automation route preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists the folder's rules (its own, then inherited) and where files of the given `names` would go; a `draft` rule also says how many recent files it would take.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationRoutePreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/route-preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "PreviewRoutes",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists the folder's rules (its own, then inherited) and where files of the given `names` would go; a `draft` rule also says how many recent files it would take.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationRoutePreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.preview_routes",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "automation.run-file.add-anyway",
      "command_path": "automation run-file add-anyway",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Appends a file a run skipped as a duplicate to its destination dataset; find the run file id with `automation runs`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationRunFileAddAnywayResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/run-files/{run_file_id}/add-anyway",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddRunFileAnyway",
      "pagination_policy": "none",
      "preconditions": "Appends a file a run skipped as a duplicate to its destination dataset; find the run file id with `automation runs`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationRunFileAddAnywayResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.add_run_file_anyway",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "automation.runs",
      "command_path": "automation runs",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Newest first, each run with its files; `limit` is capped at 50 by the server.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AutomationRunsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/runs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAutomationRuns",
      "pagination_policy": "none",
      "preconditions": "Read-only. Newest first, each run with its files; `limit` is capped at 50 by the server.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AutomationRunsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.runs",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "automation.trash",
      "command_path": "automation trash",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: AUTOMATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationTrashResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TrashAutomation",
      "pagination_policy": "none",
      "preconditions": "Required inputs: AUTOMATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationTrashResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.trash",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "automation.update",
      "command_path": "automation update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes a live automation (run, status, retention approval): read it first (`automation get`). Needs --yes. Each patch item is op + path + value: `command` + `run` (run now), `replace` + `status` (`suspend` or `resume`), `replace` + `details` (an object with at least one of name, description, tasks, conditions). Paths are details, run, status, approve_retention, reject_retention. On a data-refresh automation, --input with add_datasets and remove_datasets (lists of dataset ids) changes its datasets without a patch list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "AutomationUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/automations/{automation_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "UpdateAutomation",
      "pagination_policy": "none",
      "preconditions": "Changes a live automation (run, status, retention approval): read it first (`automation get`). Needs --yes. Each patch item is op + path + value: `command` + `run` (run now), `replace` + `status` (`suspend` or `resume`), `replace` + `details` (an object with at least one of name, description, tasks, conditions). Paths are details, run, status, approve_retention, reject_retention. On a data-refresh automation, --input with add_datasets and remove_datasets (lists of dataset ids) changes its datasets without a patch list.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "AutomationUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.automations.AutomationsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "batch.bulk-delete",
      "command_path": "batch bulk-delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "ids is required (the backend rejects a delete with no batch ids; it never deletes all batches). List ids with batch list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteBatches",
      "pagination_policy": "none",
      "preconditions": "ids is required (the backend rejects a delete with no batch ids; it never deletes all batches). List ids with batch list.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BatchBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.bulk_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "returns_job",
      "canonical_command": "batch.create",
      "command_path": "batch create",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Every source column must be mapped to an existing destination column; the CLI reads both schemas and refuses (append_mapping_incomplete) an unmapped source column or a destination the dataset lacks, because the backend appends only mapped columns. A destination column no mapping item fills (add_column items count) would be NULL in every appended row, so it is refused (append_leaves_columns_blank) unless the input lists exactly those names in blank_columns; the confirmed blanks are named in mapping_check.warnings. The CLI sends each item's expected_destination_c_type as the destination's current type (never re-types it; an explicit different value is refused with append_type_mismatch) and warns in mapping_check.warnings when source and destination types differ. SOURCE_ID is a standalone dataset in the same project (4BATC010 INVALID_SOURCE_DATASET for a file id or an append child); to append a file use file upload with append_to_ds_id. delete_source_ds=true changes the mutation class to destructive and requires confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateBatch",
      "pagination_policy": "none",
      "preconditions": "Every source column must be mapped to an existing destination column; the CLI reads both schemas and refuses (append_mapping_incomplete) an unmapped source column or a destination the dataset lacks, because the backend appends only mapped columns. A destination column no mapping item fills (add_column items count) would be NULL in every appended row, so it is refused (append_leaves_columns_blank) unless the input lists exactly those names in blank_columns; the confirmed blanks are named in mapping_check.warnings. The CLI sends each item's expected_destination_c_type as the destination's current type (never re-types it; an explicit different value is refused with append_type_mismatch) and warns in mapping_check.warnings when source and destination types differ. SOURCE_ID is a standalone dataset in the same project (4BATC010 INVALID_SOURCE_DATASET for a file id or an append child); to append a file use file upload with append_to_ds_id. delete_source_ds=true changes the mutation class to destructive and requires confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BatchCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "batch.create-spec",
      "command_path": "batch create-spec",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Release BatchesPostRequest; file_id-only or source_id plus homogeneous mapping array. Dynamic confirmation applies only to delete_source_ds.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "BatchCreateSpecResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Release BatchesPostRequest; file_id-only or source_id plus homogeneous mapping array. Dynamic confirmation applies only to delete_source_ds.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "BatchCreateSpecResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "returns_job",
      "canonical_command": "batch.delete",
      "command_path": "batch delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "returns_job",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Resolve the batch before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteBatch",
      "pagination_policy": "none",
      "preconditions": "Resolve the batch before confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BatchDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "batch.get",
      "command_path": "batch get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID, BATCH_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BatchGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetBatch",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID, BATCH_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BatchGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "batch.list",
      "command_path": "batch list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BatchListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetBatches",
      "pagination_policy": "offset",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BatchListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "returns_job",
      "canonical_command": "batch.update",
      "command_path": "batch update",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The server takes one patch operation per call: {\"patch\": {\"op\": \"replace\", \"path\": \"batches\", \"value\": {\"suspend\": [BATCH_ID], \"restore\": [BATCH_ID]}}} (a list holding that one operation is also accepted; \"path\" defaults to batches). Any remove operation in the patch changes the mutation class to destructive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BatchUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateBatches",
      "pagination_policy": "none",
      "preconditions": "The server takes one patch operation per call: {\"patch\": {\"op\": \"replace\", \"path\": \"batches\", \"value\": {\"suspend\": [BATCH_ID], \"restore\": [BATCH_ID]}}} (a list holding that one operation is also accepted; \"path\" defaults to batches). Any remove operation in the patch changes the mutation class to destructive.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BatchUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.batches.BatchesAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.chargebee-plan",
      "command_path": "billing chargebee-plan",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingChargebeePlanResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/chargebee-plan",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetChargebeePlan",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingChargebeePlanResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.chargebee_plan",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.hosted-page",
      "command_path": "billing hosted-page",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Creates a hosted billing page URL for object_type (for example change_plan). Nothing changes until someone completes the page. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingHostedPageResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription_v1/hosted-page",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "FetchHostedPage",
      "pagination_policy": "none",
      "preconditions": "Creates a hosted billing page URL for object_type (for example change_plan). Nothing changes until someone completes the page. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingHostedPageResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.hosted_page",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.invoice.charge",
      "command_path": "billing invoice charge",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Charges the workspace's open invoice to its saved payment method now; money moves. Read `billing stripe status` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingInvoiceChargeResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/invoices/charge",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ChargeWorkspaceInvoices",
      "pagination_policy": "none",
      "preconditions": "Charges the workspace's open invoice to its saved payment method now; money moves. Read `billing stripe status` first. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingInvoiceChargeResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.invoice_charge",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "billing.invoice.list",
      "command_path": "billing invoice list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingInvoiceListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingInvoiceListResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.cancel",
      "command_path": "billing stripe cancel",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Cancels the workspace subscription at the billing provider. Read `billing stripe status` first; `billing stripe resume` reverses a pending cancel. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCancelResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/cancel",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CancelWorkspaceSubscription",
      "pagination_policy": "none",
      "preconditions": "Cancels the workspace subscription at the billing provider. Read `billing stripe status` first; `billing stripe resume` reverses a pending cancel. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeCancelResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_cancel",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.checkout-url",
      "command_path": "billing stripe checkout-url",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Creates a checkout URL (success_url and cancel_url are required); nothing is charged until someone completes it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCheckoutUrlResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/create-checkout",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateCheckoutUrl",
      "pagination_policy": "none",
      "preconditions": "Creates a checkout URL (success_url and cancel_url are required); nothing is charged until someone completes it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeCheckoutUrlResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_checkout_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.create",
      "command_path": "billing stripe create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateWorkspaceSubscription",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.end-trial",
      "command_path": "billing stripe end-trial",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Ends the workspace's free trial now and starts billing; the CLI cannot undo it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeEndTrialResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/end-trial",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "EndTrialAndStartSubscription",
      "pagination_policy": "none",
      "preconditions": "Ends the workspace's free trial now and starts billing; the CLI cannot undo it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeEndTrialResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_end_trial",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.get",
      "command_path": "billing stripe get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaceSubscription",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.held-change.cancel",
      "command_path": "billing stripe held-change cancel",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Irreversible: voids the unpaid invoice of the plan change the workspace is holding. If that invoice was already paid, the change is applied instead and the result says landed: true. Read `billing stripe held-change get` first; the confirmation and --dry-run name the held plan. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeHeldChangeCancelResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "POST /workspaces/{workspace_id}/subscription/held-change/cancel",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "CancelHeldChange",
      "pagination_policy": "none",
      "preconditions": "Irreversible: voids the unpaid invoice of the plan change the workspace is holding. If that invoice was already paid, the change is applied instead and the result says landed: true. Read `billing stripe held-change get` first; the confirmation and --dry-run name the held plan. Needs --yes and --confirm WORKSPACE_ID (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeHeldChangeCancelResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_held_change_cancel",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.held-change.get",
      "command_path": "billing stripe held-change get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Answers not found when no plan change is waiting for payment.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeHeldChangeGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/held-change",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetHeldChange",
      "pagination_policy": "none",
      "preconditions": "Answers not found when no plan change is waiting for payment.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeHeldChangeGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_held_change_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.history",
      "command_path": "billing stripe history",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeHistoryResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/billing-history",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaceBillingHistory",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeHistoryResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_history",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.payment-method.delete",
      "command_path": "billing stripe payment-method delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePaymentMethodDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/subscription/payment-methods/{payment_method_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeletePaymentMethod",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripePaymentMethodDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.payment-method.list",
      "command_path": "billing stripe payment-method list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripePaymentMethodListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/payment-methods",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPaymentMethods",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripePaymentMethodListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.payment-method.set-default",
      "command_path": "billing stripe payment-method set-default",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePaymentMethodSetDefaultResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/payment-methods/default",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SetDefaultPaymentMethod",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PAYMENT_METHOD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripePaymentMethodSetDefaultResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_payment_method_set_default",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.portal-url",
      "command_path": "billing stripe portal-url",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Creates a customer-portal link that grants access to the workspace's billing; do not log or share it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripePortalUrlResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/customer-portal",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateCustomerPortalUrl",
      "pagination_policy": "none",
      "preconditions": "Creates a customer-portal link that grants access to the workspace's billing; do not log or share it. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripePortalUrlResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_portal_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.preview-invoice",
      "command_path": "billing stripe preview-invoice",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripePreviewInvoiceResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/preview-invoice",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "PreviewInvoice",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripePreviewInvoiceResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_preview_invoice",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "billing.stripe.recheck-limits",
      "command_path": "billing stripe recheck-limits",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Recomputes which plan limits the workspace exceeds and stores the over-limit lock (over_limit_info: over_limit, items, advisory). Run it after deleting items; the lock clears once everything is under the limits. Safe to repeat.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeRecheckLimitsResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/subscription/recheck-limits",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RecheckWorkspaceLimits",
      "pagination_policy": "none",
      "preconditions": "Recomputes which plan limits the workspace exceeds and stores the over-limit lock (over_limit_info: over_limit, items, advisory). Run it after deleting items; the lock clears once everything is under the limits. Safe to repeat.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeRecheckLimitsResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_recheck_limits",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.resume",
      "command_path": "billing stripe resume",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Keep the paid plan: clears a scheduled cancel-at-period-end downgrade, so the workspace does not move to Free at period end. With nothing scheduled the message says so and nothing changes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeResumeResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/resume",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ResumeWorkspaceSubscription",
      "pagination_policy": "none",
      "preconditions": "Keep the paid plan: clears a scheduled cancel-at-period-end downgrade, so the workspace does not move to Free at period end. With nothing scheduled the message says so and nothing changes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeResumeResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_resume",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.retry-payment",
      "command_path": "billing stripe retry-payment",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Retries the failed payment on the workspace's latest invoice; money moves if it succeeds. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeRetryPaymentResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/retry-payment",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RetryPayment",
      "pagination_policy": "none",
      "preconditions": "Retries the failed payment on the workspace's latest invoice; money moves if it succeeds. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeRetryPaymentResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_retry_payment",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.status",
      "command_path": "billing stripe status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeStatusResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/status",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaceSubscriptionStatus",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeStatusResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_status",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.storage.set",
      "command_path": "billing stripe storage set",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sets the TOTAL purchased storage in GB (the plan's included storage or one of its storage options), not an increment. Inline-pricing plans only; the subscription is re-priced and the difference invoiced at once. Preview the cost first with billing stripe preview-invoice.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeStorageSetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /workspaces/{workspace_id}/subscription/storage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateSubscriptionStorage",
      "pagination_policy": "none",
      "preconditions": "Sets the TOTAL purchased storage in GB (the plan's included storage or one of its storage options), not an increment. Inline-pricing plans only; the subscription is re-priced and the difference invoiced at once. Preview the cost first with billing stripe preview-invoice.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeStorageSetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_storage_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.sync",
      "command_path": "billing stripe sync",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Re-reads the subscription from the billing provider and overwrites Mammoth's copy of plan and status. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingStripeSyncResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/subscription/sync",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SyncSubscription",
      "pagination_policy": "none",
      "preconditions": "Re-reads the subscription from the billing provider and overwrites Mammoth's copy of plan and status. Needs --yes and --confirm TARGET (the refusal prints the exact target).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingStripeSyncResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_sync",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.upcoming-invoice",
      "command_path": "billing stripe upcoming-invoice",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeUpcomingInvoiceResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/upcoming-invoice",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUpcomingInvoice",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeUpcomingInvoiceResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_upcoming_invoice",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.stripe.usage",
      "command_path": "billing stripe usage",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingStripeUsageResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription/usage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaceUsage",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingStripeUsageResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.stripe_usage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.subscription.get",
      "command_path": "billing subscription get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BillingSubscriptionGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/subscription_v1",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWkspSubscriptionDetail",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BillingSubscriptionGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.subscription_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "billing.subscription.update",
      "command_path": "billing subscription update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Plans: storage 1 GB Free, 10 GB Starter, 50 GB Pro; users 1, 5, 10.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "BillingSubscriptionUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/subscription_v1",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateSubscriptionDetail",
      "pagination_policy": "none",
      "preconditions": "Plans: storage 1 GB Free, 10 GB Starter, 50 GB Pro; users 1, 5, 10.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "BillingSubscriptionUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.billing.BillingAPI.subscription_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.ancestors",
      "command_path": "browse ancestors",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The folder path (breadcrumb) of a FOLDER of the active project: the chain from the project root down to the folder itself, root first (resources v2). Pass the folder's resource_id from browse resources, not its object id. Any other id answers 404; 0 means the project root and returns an empty path. For a dataset or view, take its parent_resource_id first.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseAncestorsResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources/ancestors",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetResourceAncestors",
      "pagination_policy": "none",
      "preconditions": "The folder path (breadcrumb) of a FOLDER of the active project: the chain from the project root down to the folder itself, root first (resources v2). Pass the folder's resource_id from browse resources, not its object id. Any other id answers 404; 0 means the project root and returns an empty path. For a dataset or view, take its parent_resource_id first.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseAncestorsResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.resource_ancestors",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.folder",
      "command_path": "browse folder",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Validate level and add continuation only if proven.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseFolderResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}/browse",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "BrowseFolderFolders",
      "pagination_policy": "single_page",
      "preconditions": "Validate level and add continuation only if proven.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseFolderResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.folder_resources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.project",
      "command_path": "browse project",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Some servers answer this with HTTP 500; that is a server error, not server_unavailable.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseProjectResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/browse",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "BrowseProjectProjects",
      "pagination_policy": "offset",
      "preconditions": "Some servers answer this with HTTP 500; that is a server error, not server_unavailable.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseProjectResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.browse",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.resource",
      "command_path": "browse resource",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "One resource of the project with its full properties (resources v2); name the type, then the id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourceResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources/{resource_type}/{object_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetResource",
      "pagination_policy": "none",
      "preconditions": "One resource of the project with its full properties (resources v2); name the type, then the id.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseResourceResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.resource_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.resources",
      "command_path": "browse resources",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "cursor"
        },
        "preconditions": "One project's resources a cursor page at a time (resources v2): pass next_cursor back as cursor while has_more is true. Optional parent_type and parent_id list inside a folder; resource_type, search, sort and fields narrow the page.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourcesResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resources",
      "limits": {
        "continuation": "not_proven",
        "pagination": "cursor"
      },
      "mutation_class": "read",
      "operation_id": "ListResources",
      "pagination_policy": "cursor",
      "preconditions": "One project's resources a cursor page at a time (resources v2): pass next_cursor back as cursor while has_more is true. Optional parent_type and parent_id list inside a folder; resource_type, search, sort and fields narrow the page.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseResourcesResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.resources.bulk",
      "command_path": "browse resources bulk",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Gets many resources of the active project by type and id in one request (resources v2; 100 pairs per request, more are chunked). Pass items in --input as [type, id] pairs, for example [[\"dataview\", 42]]. A pair that does not exist in the project, or that you cannot read, is left out of the answer.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseResourcesBulkResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/resources/bulk",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "BulkGetResources",
      "pagination_policy": "none",
      "preconditions": "Gets many resources of the active project by type and id in one request (resources v2; 100 pairs per request, more are chunked). Pass items in --input as [type, id] pairs, for example [[\"dataview\", 42]]. A pair that does not exist in the project, or that you cannot read, is left out of the answer.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseResourcesBulkResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_bulk",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.root",
      "command_path": "browse root",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseRootResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /browse",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "BrowseResources",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseRootResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.root",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.search",
      "command_path": "browse search",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "cursor"
        },
        "preconditions": "Searches resources across every project you can open in the workspace (resources v2), a cursor page at a time: pass next_cursor back as cursor while has_more is true. search matches names; resource_type (comma-separated), sort and fields narrow the page. Needs no active project. Each dataset hit carries dataset_id (its object_id) and each view hit view_id: pass those, never the tree id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseSearchResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/resources",
      "limits": {
        "continuation": "not_proven",
        "pagination": "cursor"
      },
      "mutation_class": "read",
      "operation_id": "SearchResources",
      "pagination_policy": "cursor",
      "preconditions": "Searches resources across every project you can open in the workspace (resources v2), a cursor page at a time: pass next_cursor back as cursor while has_more is true. search matches names; resource_type (comma-separated), sort and fields narrow the page. Needs no active project. Each dataset hit carries dataset_id (its object_id) and each view hit view_id: pass those, never the tree id.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseSearchResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.resources_search",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "browse.workspace",
      "command_path": "browse workspace",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Validate level against the OpenAPI enum and report truncation.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "BrowseWorkspaceResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/browse",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "BrowseWorkspaceWorkspaces",
      "pagination_policy": "single_page",
      "preconditions": "Validate level against the OpenAPI enum and report truncation.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "BrowseWorkspaceResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.browse.BrowseAPI.workspace_resources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "calc",
      "command_path": "calc",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Every number reported to the user comes from a tool result: use calc for a single expression, view data compare for a per-key comparison across two views. Never compute a difference or percentage mentally.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CalcResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Every number reported to the user comes from a tool result: use calc for a single expression, view data compare for a per-key comparison across two views. Never compute a difference or percentage mentally.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CalcResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "capabilities",
      "command_path": "capabilities",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists only the known gaps. A goal it does not name may simply be supported; run mammoth how GOAL or mammoth schema find WORDS.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilitiesResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Lists only the known gaps. A goal it does not name may simply be supported; run mammoth how GOAL or mammoth schema find WORDS.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CapabilitiesResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "capability.find",
      "command_path": "capability find",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Required inputs: QUERY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityFindResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "offset",
      "preconditions": "Required inputs: QUERY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CapabilityFindResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "capability.get",
      "command_path": "capability get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: OPERATION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityGetResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: OPERATION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CapabilityGetResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "capability.list",
      "command_path": "capability list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CapabilityListResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CapabilityListResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "client-app.create",
      "command_path": "client-app create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The app key and token are shown once, in this response only; store them at once. They are redacted from logs and diagnostics. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/clientapps",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateApp",
      "pagination_policy": "none",
      "preconditions": "The app key and token are shown once, in this response only; store them at once. They are redacted from logs and diagnostics. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ClientAppCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "client-app.delete",
      "command_path": "client-app delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes the client app and invalidates its key for good. Needs --yes and --confirm CLIENT_KEY (the exact key).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppDeleteResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/clientapps/{client_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteApp",
      "pagination_policy": "none",
      "preconditions": "Deletes the client app and invalidates its key for good. Needs --yes and --confirm CLIENT_KEY (the exact key).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ClientAppDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "client-app.get",
      "command_path": "client-app get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "client_key is a secret-bearing identifier and is redacted in diagnostics.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/clientapps/{client_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AppDetails",
      "pagination_policy": "none",
      "preconditions": "client_key is a secret-bearing identifier and is redacted in diagnostics.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ClientAppGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "client-app.list",
      "command_path": "client-app list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Lists the workspace's client apps.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/clientapps",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "ListApps",
      "pagination_policy": "offset",
      "preconditions": "Lists the workspace's client apps.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ClientAppListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "client-app.update",
      "command_path": "client-app update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B21 CLIENT_APP_PATCH_UNCONSTRAINED]: op/path/value are arbitrary strings; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ClientAppUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/clientapps/{client_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateApp",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B21 CLIENT_APP_PATCH_UNCONSTRAINED]: op/path/value are arbitrary strings; reserved, not registered.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ClientAppUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.clientapps.ClientAppsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.active-job",
      "command_path": "collection active-job",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Returns the collection's upload job that is still in flight, so an interrupted upload can be resumed. Use collection job to poll one job by id.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionActiveJobResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/active-job",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ActiveJob",
      "pagination_policy": "none",
      "preconditions": "Read-only. Returns the collection's upload job that is still in flight, so an interrupted upload can be resumed. Use collection job to poll one job by id.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionActiveJobResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.active_job",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.activity",
      "command_path": "collection activity",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Who opened the collection and which of its dashboards get opened: opened, member_count, people (email, status, last_opened_at) and dashboards (views, viewers).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionActivityResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/activity",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "CollectionActivity",
      "pagination_policy": "none",
      "preconditions": "Read-only. Who opened the collection and which of its dashboards get opened: opened, member_count, people (email, status, last_opened_at) and dashboards (views, viewers).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionActivityResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.activity",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.create",
      "command_path": "collection create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Creates a collection in the active project (--project, or input project_id). name is 1 to 120 characters; dashboard_ids puts boards in it, in order. Nobody else sees it until collection share.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionCreateResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /collections",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateCollection",
      "pagination_policy": "none",
      "preconditions": "Creates a collection in the active project (--project, or input project_id). name is 1 to 120 characters; dashboard_ids puts boards in it, in order. Nobody else sees it until collection share.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionCreateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.dashboards.add",
      "command_path": "collection dashboards add",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds dashboards to the collection, which gives its members access to them. notify true also emails the members. Always needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDashboardsAddResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /collections/{collection_id}/dashboards",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "AddDashboards",
      "pagination_policy": "none",
      "preconditions": "Adds dashboards to the collection, which gives its members access to them. notify true also emails the members. Always needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionDashboardsAddResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.add_dashboards",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.dashboards.remove",
      "command_path": "collection dashboards remove",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Takes one dashboard out of the collection. The dashboard is kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDashboardsRemoveResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /collections/{collection_id}/dashboards/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "RemoveDashboard",
      "pagination_policy": "none",
      "preconditions": "Takes one dashboard out of the collection. The dashboard is kept.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionDashboardsRemoveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.remove_dashboard",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.delete",
      "command_path": "collection delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes the collection and ends every member's access through it. The dashboards in it are kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionDeleteResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /collections/{collection_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteCollection",
      "pagination_policy": "none",
      "preconditions": "Deletes the collection and ends every member's access through it. The dashboards in it are kept.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "collection.email-updates.get",
      "command_path": "collection email-updates get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: COLLECTION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionEmailUpdatesGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/email-updates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCollectionEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Required inputs: COLLECTION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionEmailUpdatesGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.email_updates",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "collection.email-updates.me.get",
      "command_path": "collection email-updates me get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: COLLECTION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionEmailUpdatesMeGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/email-updates/me",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetMyCollectionEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Required inputs: COLLECTION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionEmailUpdatesMeGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.my_email_updates",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.email-updates.me.set",
      "command_path": "collection email-updates me set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Turns your own email updates for the collection on or off; nobody else's.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesMeSetResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /collections/{collection_id}/email-updates/me",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetMyCollectionEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Turns your own email updates for the collection on or off; nobody else's.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionEmailUpdatesMeSetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.set_my_email_updates",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "collection.email-updates.set",
      "command_path": "collection email-updates set",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Saves the collection's email-update schedule and the phone numbers or people it reaches. Needs --yes. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesSetResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PUT /collections/{collection_id}/email-updates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "SaveCollectionEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Saves the collection's email-update schedule and the phone numbers or people it reaches. Needs --yes. Editors only.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionEmailUpdatesSetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.set_email_updates",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "collection.email-updates.test",
      "command_path": "collection email-updates test",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sends a real test email update right away. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionEmailUpdatesTestResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /collections/{collection_id}/email-updates/test",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "TestCollectionEmailUpdate",
      "pagination_policy": "none",
      "preconditions": "Sends a real test email update right away. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionEmailUpdatesTestResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.send_test_email_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.files.upload",
      "command_path": "collection files upload",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Uploads local files to refresh the collection's data. Input files is the list of paths; append_to_ds_id appends to one of the refresh datasets. The server answers with an upload job id and refreshes in the background.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionFilesUploadResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /collections/{collection_id}/files",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UploadFile",
      "pagination_policy": "none",
      "preconditions": "Uploads local files to refresh the collection's data. Input files is the list of paths; append_to_ds_id appends to one of the refresh datasets. The server answers with an upload job id and refreshes in the background.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionFilesUploadResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.upload_files",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.for-dashboard",
      "command_path": "collection for-dashboard",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The collections that hold this dashboard, in the shape collection list returns.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionForDashboardResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/for-dashboard/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "CollectionsForDashboard",
      "pagination_policy": "none",
      "preconditions": "Read-only. The collections that hold this dashboard, in the shape collection list returns.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionForDashboardResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.for_dashboard",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.get",
      "command_path": "collection get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. One collection with its dashboards in order, its members (managers only), and its refresh setup.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionGetResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCollection",
      "pagination_policy": "none",
      "preconditions": "Read-only. One collection with its dashboards in order, its members (managers only), and its refresh setup.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.get-by-url",
      "command_path": "collection get-by-url",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Opens a collection by its share url token, as a viewer does. Input t is the invite token, which the server redeems on the way in; email is the address the invite went to.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionGetByUrlResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/url/{url}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCollectionByUrl",
      "pagination_policy": "none",
      "preconditions": "Read-only. Opens a collection by its share url token, as a viewer does. Input t is the invite token, which the server redeems on the way in; email is the address the invite went to.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionGetByUrlResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.get_by_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.job",
      "command_path": "collection job",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Polls one collection upload job by id and returns its state.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionJobResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/jobs/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetRefreshJob",
      "pagination_policy": "none",
      "preconditions": "Read-only. Polls one collection upload job by id and returns its state.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionJobResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.job",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.list",
      "command_path": "collection list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The collections you manage or were shared, each with its role (manager or member), url, project and dashboard count.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionListResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListCollections",
      "pagination_policy": "none",
      "preconditions": "Read-only. The collections you manage or were shared, each with its role (manager or member), url, project and dashboard count.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.members.remove",
      "command_path": "collection members remove",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Takes one person off the collection by email.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionMembersRemoveResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /collections/{collection_id}/members",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "RemoveMember",
      "pagination_policy": "none",
      "preconditions": "Takes one person off the collection by email.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionMembersRemoveResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.remove_member",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.pipeline-changes",
      "command_path": "collection pipeline-changes",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Progress of the collection's data refresh; empty when no automation is linked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CollectionPipelineChangesResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /collections/{collection_id}/pipeline-changes",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "PipelineChanges",
      "pagination_policy": "none",
      "preconditions": "Read-only. Progress of the collection's data refresh; empty when no automation is linked.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CollectionPipelineChangesResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.pipeline_changes",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.share",
      "command_path": "collection share",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Gives people access to the collection by email and sends them the invite. The result lists added, already (members before) and in_project (skipped: they already edit the project's boards). Always needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionShareResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /collections/{collection_id}/share",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "ShareCollection",
      "pagination_policy": "none",
      "preconditions": "Gives people access to the collection by email and sends them the invite. The result lists added, already (members before) and in_project (skipped: they already edit the project's boards). Always needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionShareResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.share",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "collection.update",
      "command_path": "collection update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes only the fields given: name, description, order (every dashboard id, in the new order), tab_labels (dashboard id to a short label; empty clears it), automation_id to link the upload-to-refresh automation, or unlink_automation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "CollectionUpdateResult",
        "scope": "profile",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /collections/{collection_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateCollection",
      "pagination_policy": "none",
      "preconditions": "Changes only the fields given: name, description, order (every dashboard id, in the new order), tab_labels (dashboard id to a short label; empty clears it), automation_id to link the upload-to-refresh automation, or unlink_automation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "CollectionUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.collections.CollectionsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "completion.install",
      "command_path": "completion install",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "CompletionInstallResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "CompletionInstallResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "completion.show",
      "command_path": "completion show",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "CompletionShowResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "CompletionShowResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "config.get",
      "command_path": "config get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigGetResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: KEY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConfigGetResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "config.list",
      "command_path": "config list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigListResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConfigListResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "config.path",
      "command_path": "config path",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConfigPathResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConfigPathResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "config.set",
      "command_path": "config set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: KEY, VALUE.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ConfigSetResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: KEY, VALUE.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ConfigSetResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.active",
      "command_path": "connector active",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorActiveResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/active_connectors",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetActiveConnectors",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorActiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.active_connectors",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.ai.chat",
      "command_path": "connector ai chat",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiChatResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "Chat",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorAiChatResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.chat",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.ai.history",
      "command_path": "connector ai history",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTION_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiHistoryResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/history",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetChatHistory",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTION_KEY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorAiHistoryResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.history",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.ai.session.list",
      "command_path": "connector ai session list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiSessionListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/sessions",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSessions",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorAiSessionListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.session_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.ai.session.messages",
      "command_path": "connector ai session messages",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorAiSessionMessagesResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/sessions/{session_id}/messages",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSessionMessages",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorAiSessionMessagesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.session_messages",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.ai.submit-column-selection",
      "command_path": "connector ai submit-column-selection",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiSubmitColumnSelectionResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/column-selection",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SubmitColumnSelection",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorAiSubmitColumnSelectionResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.submit_column_selection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.ai.submit-credentials",
      "command_path": "connector ai submit-credentials",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorAiSubmitCredentialsResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/credentials",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SubmitCredentials",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorAiSubmitCredentialsResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_ai.ConnectorAIAPI.submit_credentials",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "connector.connection.create",
      "command_path": "connector connection create",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The connection document depends on connector_key (see `connector get KEY` for its fields); credentials in it are secrets, so pass them through a protected --input FILE.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "SaveConnection",
      "pagination_policy": "none",
      "preconditions": "The connection document depends on connector_key (see `connector get KEY` for its fields); credentials in it are secrets, so pass them through a protected --input FILE.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorConnectionCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.create_connection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.connection.delete",
      "command_path": "connector connection delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Resolve immutable key before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionDeleteResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteConnection",
      "pagination_policy": "none",
      "preconditions": "Resolve immutable key before confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorConnectionDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.delete_connection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.connection.get",
      "command_path": "connector connection get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Secrets in the returned config are redacted. Without --project it looks for the project that holds the connection; when none or several do, it fails with project_required and names them.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetConnection",
      "pagination_policy": "none",
      "preconditions": "Secrets in the returned config are redacted. Without --project it looks for the project that holds the connection; when none or several do, it fails with project_required and names them.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorConnectionGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get_connection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.connection.list",
      "command_path": "connector connection list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Without a connector key the result lists the connections of every connector in 'connector active', each row with its connector_key. Secrets in a connection's config are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListConnections",
      "pagination_policy": "single_page",
      "preconditions": "Without a connector key the result lists the connections of every connector in 'connector active', each row with its connector_key. Secrets in a connection's config are redacted.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorConnectionListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_connections",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.connection.list-all",
      "command_path": "connector connection list-all",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionListAllResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connections",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListAllConnections",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorConnectionListAllResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_all_connections",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "connector.connection.query",
      "command_path": "connector connection query",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Runs one SELECT on the connected database and returns a sample of its rows in data_sample (dataschema and rows). It saves no data source configuration and creates no dataset, so it needs no --yes; Mammoth keeps only the short-lived job that carried the request. The CLI refuses anything but a single SELECT or WITH ... SELECT, and the connection's database user decides what the database allows. The sample is limited to the first rows of the result, so add your own LIMIT or aggregate for a large table. To turn a query into a dataset use dataset create.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorConnectionQueryResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "single_page",
      "preconditions": "Runs one SELECT on the connected database and returns a sample of its rows in data_sample (dataschema and rows). It saves no data source configuration and creates no dataset, so it needs no --yes; Mammoth keeps only the short-lived job that carried the request. The CLI refuses anything but a single SELECT or WITH ... SELECT, and the connection's database user decides what the database allows. The sample is limited to the first rows of the result, so add your own LIMIT or aggregate for a large table. To turn a query into a dataset use dataset create.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorConnectionQueryResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.connection.test",
      "command_path": "connector connection test",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs project admin; the check reaches the connection's own service and its result is kept.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionTestResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connections/{connection_key}/test",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TestConnection",
      "pagination_policy": "none",
      "preconditions": "Needs project admin; the check reaches the connection's own service and its result is kept.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorConnectionTestResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.test_connection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "connector.connection.update",
      "command_path": "connector connection update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs --yes if validation contacts the destination.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorConnectionUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "UpdateConnection",
      "pagination_policy": "none",
      "preconditions": "Needs --yes if validation contacts the destination.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorConnectionUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.update_connection",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.browse",
      "command_path": "connector draft browse",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. A files-shaped source only; for Google Sheets it lists the account's recent spreadsheets.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftBrowseResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/browse",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "BrowseConnectorDraftFolderConnectorDrafts",
      "pagination_policy": "none",
      "preconditions": "Read-only. A files-shaped source only; for Google Sheets it lists the account's recent spreadsheets.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftBrowseResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.browse",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.create",
      "command_path": "connector draft create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Without `session_id` the server starts an agent chat for the draft. A draft with no `connection_key` needs the project admin role. Another live draft for the same connector or connection comes back as `resume_candidate`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftCreateResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateConnectorDraft",
      "pagination_policy": "none",
      "preconditions": "Without `session_id` the server starts an agent chat for the draft. A draft with no `connection_key` needs the project admin role. Another live draft for the same connector or connection comes back as `resume_candidate`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.discard",
      "command_path": "connector draft discard",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Hides the draft from every list; its chat thread stays.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftDiscardResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DiscardConnectorDraft",
      "pagination_policy": "none",
      "preconditions": "Hides the draft from every list; its chat thread stays.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftDiscardResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.discard",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.fill",
      "command_path": "connector draft fill",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Pass exactly one of `file_object_id` or `dataset_id`. 409 while the file is still being read; retry once it is.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftFillResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/fill",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "FillConnectorDraftGap",
      "pagination_policy": "none",
      "preconditions": "Pass exactly one of `file_object_id` or `dataset_id`. 409 while the file is still being read; retry once it is.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftFillResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.fill",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.get",
      "command_path": "connector draft get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A per-parent table's `each` block says how its preview was sampled. `each.summary` reads like \"sampled 20 of 76 parents; 17 read, 3 failed\", or \"capped at 20 parents, total unknown\" when the parent table's row count is not known. `each.total` is the sample size, not the parent count (`each.parents_total` is).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetConnectorDraft",
      "pagination_policy": "none",
      "preconditions": "A per-parent table's `each` block says how its preview was sampled. `each.summary` reads like \"sampled 20 of 76 parents; 17 read, 3 failed\", or \"capped at 20 parents, total unknown\" when the parent table's row count is not known. `each.total` is the sample size, not the parent count (`each.parents_total` is).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.known-sources",
      "command_path": "connector draft known-sources",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Sources with no built-in connector that a draft can still start on, deep ones first.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftKnownSourcesResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/known-sources",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectorKnownSources",
      "pagination_policy": "none",
      "preconditions": "Read-only. Sources with no built-in connector that a draft can still start on, deep ones first.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftKnownSourcesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.known_sources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.list",
      "command_path": "connector draft list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. `status`: live (not saved yet, the default), saved or all.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectorDrafts",
      "pagination_policy": "none",
      "preconditions": "Read-only. `status`: live (not saved yet, the default), saved or all.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.open",
      "command_path": "connector draft open",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Take `ref` and `name` from a `connector draft browse` entry; each tab becomes a table of the draft.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftOpenResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/open",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "OpenConnectorDraftEntry",
      "pagination_policy": "none",
      "preconditions": "Take `ref` and `name` from a `connector draft browse` entry; each tab becomes a table of the draft.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftOpenResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.open",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.read-tables",
      "command_path": "connector draft read-tables",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Queues the reads and returns how many; each table shows as not read yet until its answer lands on the draft.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftReadTablesResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/read-tables",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ReadConnectorDraftTables",
      "pagination_policy": "none",
      "preconditions": "Queues the reads and returns how many; each table shows as not read yet until its answer lands on the draft.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftReadTablesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.read_tables",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.sample",
      "command_path": "connector draft sample",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A CSV, TSV or Excel file of about 5 MB at most; the server reads its header and first rows and does not keep it. Sets the draft's target columns.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSampleResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sample",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ShapeConnectorDraftFromSample",
      "pagination_policy": "none",
      "preconditions": "A CSV, TSV or Excel file of about 5 MB at most; the server reads its header and first rows and does not keep it. Sets the draft's target columns.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftSampleResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.sample",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "connector.draft.save",
      "command_path": "connector draft save",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Makes one dataset per source and joins the others onto the main one; `refresh: daily` refreshes each API or table source daily. The draft's `result` is set when the job is done.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSaveResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/save",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "StartConnectorDraftSave",
      "pagination_policy": "none",
      "preconditions": "Makes one dataset per source and joins the others onto the main one; `refresh: daily` refreshes each API or table source daily. The draft's `result` is set when the job is done.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftSaveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.save",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.source.join-candidates",
      "command_path": "connector draft source join-candidates",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Match counts are an estimate over the rows read so far.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftSourceJoinCandidatesResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources/{source_id}/join-candidates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectorDraftJoinCandidates",
      "pagination_policy": "none",
      "preconditions": "Read-only. Match counts are an estimate over the rows read so far.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftSourceJoinCandidatesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.join_candidates",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.draft.source.list",
      "command_path": "connector draft source list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A per-parent table's `each.summary` says how many parents its preview sampled, out of how many when that is known (`each.parents_total`).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDraftSourceListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectorDraftSources",
      "pagination_policy": "none",
      "preconditions": "A per-parent table's `each.summary` says how many parents its preview sampled, out of how many when that is known (`each.parents_total`).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDraftSourceListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.sources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.source.preview",
      "command_path": "connector draft source preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reads up to `limit` (1-100) rows through the connection and records what came back on the source. The limit is sent as given, but the server can return fewer rows; when the rows come back short of `limit` and the source holds more, the answer sets `capped` true with `limit_requested`, `limit_applied` and `source_row_count`. A preview is a sample; save the draft to read every row.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftSourcePreviewResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}/sources/{source_id}/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PreviewConnectorDraftSource",
      "pagination_policy": "none",
      "preconditions": "Reads up to `limit` (1-100) rows through the connection and records what came back on the source. The limit is sent as given, but the server can return fewer rows; when the rows come back short of `limit` and the source holds more, the answer sets `capped` true with `limit_requested`, `limit_applied` and `source_row_count`. A preview is a sample; save the draft to read every row.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftSourcePreviewResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.preview_source",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.draft.update",
      "command_path": "connector draft update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "`target_columns` replaces the list whole. `echo` adds a quiet note to the draft's thread for the agent's next turn.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDraftUpdateResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connector-drafts/{draft_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PatchConnectorDraft",
      "pagination_policy": "none",
      "preconditions": "`target_columns` replaces the list whole. `echo` adds a quiet note to the draft's thread for the agent's next turn.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDraftUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connector_drafts.ConnectorDraftsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "connector.ds-config.create",
      "command_path": "connector ds-config create",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs exactly one source; validate and data_sample cannot be combined.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "ValidateAndGetDsConfig",
      "pagination_policy": "none",
      "preconditions": "Needs exactly one source; validate and data_sample cannot be combined.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDsConfigCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.create_ds_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.ds-config.delete",
      "command_path": "connector ds-config delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Resolve immutable key before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigDeleteResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDsConfig",
      "pagination_policy": "none",
      "preconditions": "Resolve immutable key before confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDsConfigDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.delete_ds_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "connector.ds-config.delete-all",
      "command_path": "connector ds-config delete-all",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigDeleteAllResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDsConfigs",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDsConfigDeleteAllResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.ds_config_delete_all",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.ds-config.get",
      "command_path": "connector ds-config get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reads one data-source config by key (from `connector ds-config list`); secrets in it are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDsConfigGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDsConfig",
      "pagination_policy": "none",
      "preconditions": "Reads one data-source config by key (from `connector ds-config list`); secrets in it are redacted.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDsConfigGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get_ds_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.ds-config.list",
      "command_path": "connector ds-config list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Secrets in nested configuration are redacted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorDsConfigListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListDsConfigs",
      "pagination_policy": "single_page",
      "preconditions": "Secrets in nested configuration are redacted.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorDsConfigListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list_ds_configs",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "connector.ds-config.update",
      "command_path": "connector ds-config update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only the query path is supported by the server today; other paths are refused. Read the config first with `connector ds-config get`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ConnectorDsConfigUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/ds_configs/{ds_config_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "UpdateDsConfigs",
      "pagination_policy": "none",
      "preconditions": "Only the query path is supported by the server today; other paths are refused. Read the config first with `connector ds-config get`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ConnectorDsConfigUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.update_ds_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.get",
      "command_path": "connector get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/connectors/{connector_key}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetConnector",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_KEY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.list",
      "command_path": "connector list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/connectors",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceConnectors",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.connectors.ConnectorsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "connector.query.generate",
      "command_path": "connector query generate",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Keys are nonempty and cannot contain '/'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorQueryGenerateResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetQuerySuggestion",
      "pagination_policy": "none",
      "preconditions": "Keys are nonempty and cannot contain '/'.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorQueryGenerateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.ai.AIAPI.query_gen",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "connector.query.status",
      "command_path": "connector query status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ConnectorQueryStatusResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/connectors/{connector_key}/connections/{connection_key}/chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetChatStatus",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_KEY, CONNECTION_KEY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ConnectorQueryStatusResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.ai.AIAPI.status",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "context.project.clear",
      "command_path": "context project clear",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ContextProjectClearResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ContextProjectClearResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "context.project.status",
      "command_path": "context project status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ContextProjectStatusResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ContextProjectStatusResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "context.project.use",
      "command_path": "context project use",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROJECT_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ContextProjectUseResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROJECT_ID.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ContextProjectUseResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "context.show",
      "command_path": "context show",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Local read, no network call. Shows which profile, endpoint, workspace and project the next command would use; it never prints credentials.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ContextShowResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Local read, no network call. Shows which profile, endpoint, workspace and project the next command would use; it never prints credentials.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ContextShowResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "returns_job",
      "canonical_command": "dashboard.action",
      "command_path": "dashboard action",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "B13 DASHBOARD_ASYNC_UNTYPED; publish/unpublish/delete-source require exact target confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardActionResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /dashboards/{dashboard_id}/action",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "DashboardAction",
      "pagination_policy": "none",
      "preconditions": "B13 DASHBOARD_ASYNC_UNTYPED; publish/unpublish/delete-source require exact target confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardActionResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.action",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.analytics",
      "command_path": "dashboard analytics",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAnalyticsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/analytics",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardAnalytics",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardAnalyticsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_analytics",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.archive",
      "command_path": "dashboard archive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardArchiveResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/{dashboard_id}/archive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ArchiveDashboard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardArchiveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.archive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.assess-pbix",
      "command_path": "dashboard assess-pbix",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "PbixAssessResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/pbix/assess",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AssessPbix",
      "pagination_policy": "none",
      "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "PbixAssessResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.assess_pbix",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.assess-twb",
      "command_path": "dashboard assess-twb",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TwbAssessResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/twb/assess",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AssessTwb",
      "pagination_policy": "none",
      "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "TwbAssessResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.assess_twb",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.attachment-create",
      "command_path": "dashboard attachment-create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Uploads a local workbook as a chat attachment. The attachment id it returns feeds dashboard pbix-intent and dashboard pbix-assess. Inside the Mammoth app the user's file cannot reach the agent, so send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardAttachmentCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/attachments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateAttachment",
      "pagination_policy": "none",
      "preconditions": "Uploads a local workbook as a chat attachment. The attachment id it returns feeds dashboard pbix-intent and dashboard pbix-assess. Inside the Mammoth app the user's file cannot reach the agent, so send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardAttachmentCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.audience.digest.get",
      "command_path": "dashboard audience digest get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Your weekly audience email setting for the board: enabled is the effective answer, explicit the stored choice (null when you never chose; the email then turns on by itself above 5 people a week for the creator and directly-granted editors). Editors only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceDigestGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/audience/digest",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAudienceDigest",
      "pagination_policy": "none",
      "preconditions": "Your weekly audience email setting for the board: enabled is the effective answer, explicit the stored choice (null when you never chose; the email then turns on by itself above 5 people a week for the creator and directly-granted editors). Editors only.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardAudienceDigestGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_digest_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.audience.digest.set",
      "command_path": "dashboard audience digest set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes your own weekly audience email setting for the board, nobody else's. Pass enabled in --input: true, false, or null to clear the choice and return to the default. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardAudienceDigestSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/audience/digest",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetAudienceDigest",
      "pagination_policy": "none",
      "preconditions": "Writes your own weekly audience email setting for the board, nobody else's. Pass enabled in --input: true, false, or null to clear the choice and return to the default. Editors only.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardAudienceDigestSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_digest_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.audience.get",
      "command_path": "dashboard audience get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Who read the board over the last days (7, 30 or 90; default 7): totals against the window before, a daily series, named workspace viewers, anonymous counts, country, device and viewport coverage, people it was shared with who never opened it, page and tile reach, and outward actions. Editors only. Never returns an IP or a city; editors' own visits are not counted.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/audience",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardAudience",
      "pagination_policy": "none",
      "preconditions": "Who read the board over the last days (7, 30 or 90; default 7): totals against the window before, a daily series, named workspace viewers, anonymous counts, country, device and viewport coverage, people it was shared with who never opened it, page and tile reach, and outward actions. Editors only. Never returns an IP or a city; editors' own visits are not counted.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardAudienceGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.audience.summary",
      "command_path": "dashboard audience summary",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Views per board for the dashboard library: pass dashboard_ids in --input (200 are read at most). Per board: views and people over 7 days, views over 30 days, the last view and a 14-day daily series. A board never viewed is absent from items; boards outside the workspace or that you cannot edit are ignored.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardAudienceSummaryResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/dashboards/audience-summary",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AudienceSummary",
      "pagination_policy": "none",
      "preconditions": "Views per board for the dashboard library: pass dashboard_ids in --input (200 are read at most). Per board: views and people over 7 days, views over 30 days, the last view and a 14-day daily series. A board never viewed is absent from items; boards outside the workspace or that you cannot edit are ignored.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardAudienceSummaryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.audience_summary",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.bi-export",
      "command_path": "dashboard bi-export",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Author-only, like bi-preflight. Terminal mode writes `output_path` to local disk. Inside the Mammoth app the download cannot reach the user: run `dashboard bi-preflight` to tell them what will convert, then send them to the dashboard's Publish menu (the arrow next to Publish) -> Export to Power BI / Export to Tableau, where they download the file themselves. No command makes a PDF of a board: that is the board's Download PDF in the app.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardBiExportResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/tableau/export",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "TableauExport",
      "pagination_policy": "none",
      "preconditions": "Author-only, like bi-preflight. Terminal mode writes `output_path` to local disk. Inside the Mammoth app the download cannot reach the user: run `dashboard bi-preflight` to tell them what will convert, then send them to the dashboard's Publish menu (the arrow next to Publish) -> Export to Power BI / Export to Tableau, where they download the file themselves. No command makes a PDF of a board: that is the board's Download PDF in the app.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardBiExportResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.export_powerbi",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.bi-preflight",
      "command_path": "dashboard bi-preflight",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Author-only, like the release routes it calls -- a non-author caller is refused, unlike `dashboard pdf export` (which any viewer can run).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "PowerBiPreflightResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/tableau",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "TableauPreflightHandler",
      "pagination_policy": "none",
      "preconditions": "Author-only, like the release routes it calls -- a non-author caller is refused, unlike `dashboard pdf export` (which any viewer can run).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "PowerBiPreflightResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.powerbi_preflight",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.cancel-generation",
      "command_path": "dashboard cancel-generation",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCancelGenerationResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/cancel-generation",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CancelDashboardGeneration",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardCancelGenerationResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.cancel_generation",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.canvas.get",
      "command_path": "dashboard canvas get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A board's data is the view in the canvas dataset.dataview_id: read it with view data get VIEW_ID. After a board's bake job, read the canvas and quote one number from it, such as a KPI total.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardCanvasGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/canvas",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCanvasDraft",
      "pagination_policy": "none",
      "preconditions": "A board's data is the view in the canvas dataset.dataview_id: read it with view data get VIEW_ID. After a board's bake job, read the canvas and quote one number from it, such as a KPI total.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardCanvasGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.canvas.restore",
      "command_path": "dashboard canvas restore",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "target_sequence must be an existing draft version -- get the list from dashboard chat history DASHBOARD_ID, whose revisions[] gives {sequence, updated_at, updated_by_name} for every saved version, oldest first; pick the sequence to undo/redo/revert to.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCanvasRestoreResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/canvas/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RestoreCanvas",
      "pagination_policy": "none",
      "preconditions": "target_sequence must be an existing draft version -- get the list from dashboard chat history DASHBOARD_ID, whose revisions[] gives {sequence, updated_at, updated_by_name} for every saved version, oldest first; pick the sequence to undo/redo/revert to.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardCanvasRestoreResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.canvas.save",
      "command_path": "dashboard canvas save",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read the canvas with dashboard canvas get, edit, write back; a canvas with pages[] bakes the ACTIVE page (pages[i].focus / pages[i].added), a root-level focus is stored but produces no descriptors. focus.kpis entries are {field, agg, label, unit, decimals, filters}; agg countDistinct persists and bakes (ILG simulation 2026-09-19). added[].measure is a column name; a ratio goes in canvas.derived[] as {id, numerator, denominator} and is referenced by id from measure or a KPI field. Validation errors return the pydantic path (e.g. pages.0.added.2.measure). The response carries bake_job_id: job wait it, then dashboard canvas get for meta.figures (figure key -> descriptor id) and dashboard descriptor-data to evaluate. This raw route does not pass the LLM unit guard that pages add / chat edit apply.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCanvasSaveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/canvas",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SaveCanvas",
      "pagination_policy": "none",
      "preconditions": "Read the canvas with dashboard canvas get, edit, write back; a canvas with pages[] bakes the ACTIVE page (pages[i].focus / pages[i].added), a root-level focus is stored but produces no descriptors. focus.kpis entries are {field, agg, label, unit, decimals, filters}; agg countDistinct persists and bakes (ILG simulation 2026-09-19). added[].measure is a column name; a ratio goes in canvas.derived[] as {id, numerator, denominator} and is referenced by id from measure or a KPI field. Validation errors return the pydantic path (e.g. pages.0.added.2.measure). The response carries bake_job_id: job wait it, then dashboard canvas get for meta.figures (figure key -> descriptor id) and dashboard descriptor-data to evaluate. This raw route does not pass the LLM unit guard that pages add / chat edit apply.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardCanvasSaveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.canvas_save",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.chart-type.create",
      "command_path": "dashboard chart-type create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Workspace owners, admins and members. 400 with the reason when the name, needs, recipe or binding template break a rule, or the workspace already keeps 200 chart types.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChartTypeCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/chart-types",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateWorkspaceChartType",
      "pagination_policy": "none",
      "preconditions": "Workspace owners, admins and members. 400 with the reason when the name, needs, recipe or binding template break a rule, or the workspace already keeps 200 chart types.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardChartTypeCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.chart-type.delete",
      "command_path": "dashboard chart-type delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Workspace owners, admins and members; 404 for a chart type of another workspace.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChartTypeDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/chart-types/{chart_type_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteWorkspaceChartType",
      "pagination_policy": "none",
      "preconditions": "Workspace owners, admins and members; 404 for a chart type of another workspace.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardChartTypeDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.chart-type.list",
      "command_path": "dashboard chart-type list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Anyone in the workspace.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardChartTypeListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/chart-types",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceChartTypes",
      "pagination_policy": "none",
      "preconditions": "Anyone in the workspace.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardChartTypeListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chart_type_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.chat.attachment.upload",
      "command_path": "dashboard chat attachment upload",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, FILE.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChatAttachmentUploadResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/chat/attachments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UploadChatAttachment",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, FILE.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardChatAttachmentUploadResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_attachment_upload",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.chat.edit",
      "command_path": "dashboard chat edit",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes an existing board from one sentence (add, remove or change a chart, KPI or page): {\"body\": {\"params\": {\"prompt\": \"<the change>\"}}}; returns changed, a one-line message, the rebaked canvas, dashboard_link and values (the evaluated number of each KPI card and tile after the edit). Use it for a change you can say in a sentence; use dashboard canvas save to author the canvas yourself (units, hiding built-in tiles).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardChatEditResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ChatEdit",
      "pagination_policy": "none",
      "preconditions": "Changes an existing board from one sentence (add, remove or change a chart, KPI or page): {\"body\": {\"params\": {\"prompt\": \"<the change>\"}}}; returns changed, a one-line message, the rebaked canvas, dashboard_link and values (the evaluated number of each KPI card and tile after the edit). Use it for a change you can say in a sentence; use dashboard canvas save to author the canvas yourself (units, hiding built-in tiles).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardChatEditResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_edit",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.chat.history",
      "command_path": "dashboard chat history",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The response carries a revisions[] list (one {sequence, updated_at, updated_by_name} per saved version, oldest first) -- real on the wire but not yet in the typed SDK model, so read it from --output json. It is the version list for dashboard canvas restore's target_sequence: to undo/revert the board, find the sequence to go back to here and pass it there.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardChatHistoryResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/chat",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3ChatHistory",
      "pagination_policy": "none",
      "preconditions": "The response carries a revisions[] list (one {sequence, updated_at, updated_by_name} per saved version, oldest first) -- real on the wire but not yet in the typed SDK model, so read it from --output json. It is the version list for dashboard canvas restore's target_sequence: to undo/revert the board, find the sequence to go back to here and pass it there.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardChatHistoryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.chat_history",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.columns",
      "command_path": "dashboard columns",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Every column of the board's source dataset with its profile: value samples, measure ranges and aggregates, date spans, and the profiler's identifier and protected-attribute verdicts, plus on_board_count, row_count and signals. Served from the cached dataset profile.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardColumnsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/columns",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetColumnRoster",
      "pagination_policy": "none",
      "preconditions": "Every column of the board's source dataset with its profile: value samples, measure ranges and aggregates, date spans, and the profiler's identifier and protected-attribute verdicts, plus on_board_count, row_count and signals. Served from the cached dataset profile.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardColumnsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.column_roster",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.context.apply",
      "command_path": "dashboard context apply",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes the candidate a dashboard context review proposed, as a new canvas version that undo and the version timeline reach. The change is the server's own reviewed plan, never canvas content from the caller. Pass the review_id from dashboard context review (second positional). Optional keep (roster keys whose hand-typed text to keep) and base_sequence (the head the review was computed against). The server rejects an expired or superseded review, and a board whose head moved since the review.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextApplyResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/context-review/{review_id}/apply",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ApplyContextReview",
      "pagination_policy": "none",
      "preconditions": "Writes the candidate a dashboard context review proposed, as a new canvas version that undo and the version timeline reach. The change is the server's own reviewed plan, never canvas content from the caller. Pass the review_id from dashboard context review (second positional). Optional keep (roster keys whose hand-typed text to keep) and base_sequence (the head the review was computed against). The server rejects an expired or superseded review, and a board whose head moved since the review.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardContextApplyResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_apply",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.context.create",
      "command_path": "dashboard context create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/contexts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateContext",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardContextCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.context.delete",
      "command_path": "dashboard context delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONTEXT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/contexts/{context_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteContext",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONTEXT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardContextDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.context.extract",
      "command_path": "dashboard context extract",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ContextExtractResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/contexts/extract",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExtractContext",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ContextExtractResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.extract_context",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.context.list",
      "command_path": "dashboard context list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardContextListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/contexts",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListContexts",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardContextListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.context.review",
      "command_path": "dashboard context review",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Dry run of a context edit: what applying the board's current context would change. Nothing is written (not the canvas, the transcript or the bake). Waits for the job; its result holds the item-level change set and a review_id, which is null when the context changes nothing. Optional scope (summary, insights or all), note (1000 characters at most) and fresh (work it out again). Pass review_id to dashboard context apply.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardContextReviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/context-review",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ReviewContext",
      "pagination_policy": "none",
      "preconditions": "Dry run of a context edit: what applying the board's current context would change. Nothing is written (not the canvas, the transcript or the bake). Waits for the job; its result holds the item-level change set and a review_id, which is null when the context changes nothing. Optional scope (summary, insights or all), note (1000 characters at most) and fresh (work it out again). Pass review_id to dashboard context apply.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardContextReviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_review",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.context.update",
      "command_path": "dashboard context update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONTEXT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardContextUpdateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/v3/contexts/{context_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateContext",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONTEXT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardContextUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.context_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.create-blank",
      "command_path": "dashboard create-blank",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "To build a board from a description, use dashboard v3 generate instead. Input is {\"params\": {\"dataview_id\": VIEW_ID, \"title\": ...}} with --yes; returns {id, sequence}. The blank canvas has one page (p1) and no figures: author it with dashboard chat edit, or by hand with dashboard canvas get -> edit -> dashboard canvas save or dashboard pages add. One dataview per dashboard.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardCreateBlankResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/blank",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateBlankDashboard",
      "pagination_policy": "none",
      "preconditions": "To build a board from a description, use dashboard v3 generate instead. Input is {\"params\": {\"dataview_id\": VIEW_ID, \"title\": ...}} with --yes; returns {id, sequence}. The blank canvas has one page (p1) and no figures: author it with dashboard chat edit, or by hand with dashboard canvas get -> edit -> dashboard canvas save or dashboard pages add. One dataview per dashboard.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardCreateBlankResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.create_blank",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.data.draft",
      "command_path": "dashboard data draft",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardDataDraftResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/getDraftData",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDraftDataFromSql",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardDataDraftResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_draft_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.data.published",
      "command_path": "dashboard data published",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardDataPublishedResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/getPublishData",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPublishDataFromSql",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardDataPublishedResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_publish_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.delete",
      "command_path": "dashboard delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable dashboard-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDashboard",
      "pagination_policy": "none",
      "preconditions": "Immutable dashboard-ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.descriptor-data",
      "command_path": "dashboard descriptor-data",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Evaluates baked descriptors by id. Ids come from dashboard canvas get data.meta.figures[<page>:<kpi|add>:<n>].descriptors.value (rows for a table figure) and data.meta.filters. body.params.filter_state is {\"<filter field>\": value} against the canvas's declared filters: a range control takes [start, end] (dates as YYYY-MM-DD), categorical controls a list of values; an undeclared field is rejected. Results are {descriptor_id: {status, value | data}}. Used to prove a countDistinct card under a Month range (ILG simulation 2026-09-19).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDescriptorDataResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DescriptorData",
      "pagination_policy": "none",
      "preconditions": "Evaluates baked descriptors by id. Ids come from dashboard canvas get data.meta.figures[<page>:<kpi|add>:<n>].descriptors.value (rows for a table figure) and data.meta.filters. body.params.filter_state is {\"<filter field>\": value} against the canvas's declared filters: a range control takes [start, end] (dates as YYYY-MM-DD), categorical controls a list of values; an undeclared field is rejected. Results are {descriptor_id: {status, value | data}}. Used to prove a countDistinct card under a Month range (ILG simulation 2026-09-19).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardDescriptorDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.descriptor_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "start_or_wait",
      "canonical_command": "dashboard.duplicate",
      "command_path": "dashboard duplicate",
      "confirmation": "none",
      "contract": {
        "async": "start_or_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Copies the dashboard over the same dataset. Example: mammoth dashboard duplicate 123 --input '{\"target_dataview_id\": 456}'. With the target_dataview_id input field the copy is made in that view's project and its data swap is queued: the command waits for that job and adds swap_state and swap_result next to id and swap_job_id. project_id (optional) names the project for the copy.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardDuplicateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/{dashboard_id}/duplicate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DuplicateDashboard",
      "pagination_policy": "none",
      "preconditions": "Copies the dashboard over the same dataset. Example: mammoth dashboard duplicate 123 --input '{\"target_dataview_id\": 456}'. With the target_dataview_id input field the copy is made in that view's project and its data swap is queued: the command waits for that job and adds swap_state and swap_result next to id and swap_job_id. project_id (optional) names the project for the copy.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardDuplicateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.duplicate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.get",
      "command_path": "dashboard email-updates get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/email-updates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmailUpdatesGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.list",
      "command_path": "dashboard email-updates list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/email-updates",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceEmailUpdates",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmailUpdatesListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.me.get",
      "command_path": "dashboard email-updates me get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmailUpdatesMeGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/email-updates/me",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetMyDashboardEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmailUpdatesMeGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_me_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.me.set",
      "command_path": "dashboard email-updates me set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Turns your own email updates for the dashboard on or off; nobody else's.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesMeSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/email-updates/me",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetMyDashboardEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Turns your own email updates for the dashboard on or off; nobody else's.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmailUpdatesMeSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_me_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.set",
      "command_path": "dashboard email-updates set",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Saves the email-update schedule and the people who get the dashboard's headline numbers by mail. Needs --yes. Editors only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesSetResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PUT /dashboards/{dashboard_id}/email-updates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "SaveDashboardEmailUpdates",
      "pagination_policy": "none",
      "preconditions": "Saves the email-update schedule and the people who get the dashboard's headline numbers by mail. Needs --yes. Editors only.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmailUpdatesSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.email-updates.test",
      "command_path": "dashboard email-updates test",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sends a real test email update right away. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmailUpdatesTestResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /dashboards/{dashboard_id}/email-updates/test",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "TestDashboardEmailUpdate",
      "pagination_policy": "none",
      "preconditions": "Sends a real test email update right away. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmailUpdatesTestResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.email_updates_test",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.embed.config.get",
      "command_path": "dashboard embed config get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedConfigGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/embed/config",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetEmbedConfig",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmbedConfigGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_config_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.embed.config.set",
      "command_path": "dashboard embed config set",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedConfigSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /dashboards/{dashboard_id}/embed/config",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "PutEmbedConfig",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedConfigSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_config_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.embed.key.rotate",
      "command_path": "dashboard embed key rotate",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedKeyRotateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/{dashboard_id}/embed/key",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RotateEmbedKey",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedKeyRotateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_key_rotate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.embed.lifetime.set",
      "command_path": "dashboard embed lifetime set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedLifetimeSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /workspaces/{workspace_id}/embed/lifetime",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetEmbedLifetime",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedLifetimeSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_lifetime_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.embed.origin.revoke",
      "command_path": "dashboard embed origin revoke",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedOriginRevokeResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /dashboards/{dashboard_id}/embed/origin",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RevokeOrigin",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedOriginRevokeResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_origin_revoke",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.embed.preview-token.create",
      "command_path": "dashboard embed preview-token create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedPreviewTokenCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/embed/preview-token",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PreviewToken",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedPreviewTokenCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_preview_token_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.embed.secret.rotate",
      "command_path": "dashboard embed secret rotate",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEmbedSecretRotateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/embed/secret",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RotateEmbedSecret",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEmbedSecretRotateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_secret_rotate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.embed.usage.get",
      "command_path": "dashboard embed usage get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedUsageGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/embed/usage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetEmbedUsage",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmbedUsageGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_usage_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.embed.usage.summary",
      "command_path": "dashboard embed usage summary",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Active embed origins per board over the last 90 days, for several boards in one call (the library view). Boards outside the workspace are ignored. For one board's origins and render counts use dashboard embed usage get.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEmbedUsageSummaryResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/dashboards/embed-usage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "EmbedUsageSummary",
      "pagination_policy": "none",
      "preconditions": "Active embed origins per board over the last 90 days, for several boards in one call (the library view). Boards outside the workspace are ignored. For one board's origins and render counts use dashboard embed usage get.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEmbedUsageSummaryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.embed_usage_summary",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.engagement.get",
      "command_path": "dashboard engagement get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Editors only. Reach against the people the board is shared with, depth per page and per person, hours (UTC), surface, devices, actions and board events. days is 7, 30 or 90 (default 30); viewers is all, named or anonymous.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEngagementGetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/engagement",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardEngagement",
      "pagination_policy": "none",
      "preconditions": "Read-only. Editors only. Reach against the people the board is shared with, depth per page and per person, hours (UTC), surface, devices, actions and board events. days is 7, 30 or 90 (default 30); viewers is all, named or anonymous.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEngagementGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.engagement.person",
      "command_path": "dashboard engagement person",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. One person's visits to the board, newest first, at most 50. Take USER_ID from the people list of dashboard engagement get. days is 7, 30 or 90 (default 30).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardEngagementPersonResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/engagement/people/{user_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardEngagementPerson",
      "pagination_policy": "none",
      "preconditions": "Read-only. One person's visits to the board, newest first, at most 50. Take USER_ID from the people list of dashboard engagement get. days is 7, 30 or 90 (default 30).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardEngagementPersonResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement_person",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.engagement.remind",
      "command_path": "dashboard engagement remind",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Emails the share link again to people who have not opened the board. user_ids takes 1 to 200 people from dashboard engagement get (people with can_remind true). The server sends one reminder per person per board every 7 days; skipped lists who was left out and why. Always needs --yes; --dry-run sends nothing.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardEngagementRemindResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /dashboards/{dashboard_id}/engagement/remind",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "PostDashboardEngagementRemind",
      "pagination_policy": "none",
      "preconditions": "Emails the share link again to people who have not opened the board. user_ids takes 1 to 200 people from dashboard engagement get (people with can_remind true). The server sends one reminder per person per board every 7 days; skipped lists who was left out and why. Always needs --yes; --dry-run sends nothing.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardEngagementRemindResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.engagement_remind",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.exemplar.extract",
      "command_path": "dashboard exemplar extract",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExemplarExtractResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/exemplar/extract",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExtractExemplar",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ExemplarExtractResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.extract_exemplar",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.figure.add",
      "command_path": "dashboard figure add",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds one figure (an explore card) with no chat turn. Pass {\"intent\": \"...\"} (optional kind) and the server picks and draws the chart, as dashboard figure-intent does; or pass an exact figure. With a figure, dataview_id must be the dashboard's own view. figure is the figure as the canvas stores it, without its id: kind plus its bindings (measure, dim, agg, title). Optional banded (a banded dimension without its id; figure.dim then points at it) and page: {\"id\": PAGE_ID} for an existing content page or {\"new_title\": \"...\"} for a new one; with neither the figure lands on the first content page. The server checks the figure against the dashboard's source and queues the bake: the result carries bake_job_id; wait for it with job wait.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardFigureAddResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/figures",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AppendFigure",
      "pagination_policy": "none",
      "preconditions": "Adds one figure (an explore card) with no chat turn. Pass {\"intent\": \"...\"} (optional kind) and the server picks and draws the chart, as dashboard figure-intent does; or pass an exact figure. With a figure, dataview_id must be the dashboard's own view. figure is the figure as the canvas stores it, without its id: kind plus its bindings (measure, dim, agg, title). Optional banded (a banded dimension without its id; figure.dim then points at it) and page: {\"id\": PAGE_ID} for an existing content page or {\"new_title\": \"...\"} for a new one; with neither the figure lands on the first content page. The server checks the figure against the dashboard's source and queues the bake: the result carries bake_job_id; wait for it with job wait.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardFigureAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.append_figure",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.figure.drill",
      "command_path": "dashboard figure drill",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Editors of the draft board. `figure` is the figure's PAGE:SLOT:ID key (the keys of `meta.figures` in `dashboard canvas get`); `path` holds 1-4 marks from the top level, each `{\"key\": VALUE}`. Waits for the job and returns the handle with its results; a figure with no level below answers 400 drill_no_level.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureDrillResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/drill",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FigureDrill",
      "pagination_policy": "none",
      "preconditions": "Editors of the draft board. `figure` is the figure's PAGE:SLOT:ID key (the keys of `meta.figures` in `dashboard canvas get`); `path` holds 1-4 marks from the top level, each `{\"key\": VALUE}`. Waits for the job and returns the handle with its results; a figure with no level below answers 400 drill_no_level.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardFigureDrillResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_drill",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.figure.recipe",
      "command_path": "dashboard figure recipe",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only: nothing is saved. Add the returned `added` spec with `dashboard figure add`. A projection is refused: a drawing cannot show a number that is not in the data.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureRecipeResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/figure-recipe",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FigureRecipe",
      "pagination_policy": "none",
      "preconditions": "Read-only: nothing is saved. Add the returned `added` spec with `dashboard figure add`. A projection is refused: a drawing cannot show a number that is not in the data.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardFigureRecipeResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_recipe",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.figure.rows",
      "command_path": "dashboard figure rows",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Editors with access to the figure's dataview; works before the figure's reader setting is on. `figure` is the PAGE:SLOT:ID key and `key` the mark's value. Waits for the job and returns the handle (which descriptor is the rows, the count and the total) with the results: up to 500 rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFigureRowsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/{dashboard_id}/rows",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FigureRows",
      "pagination_policy": "none",
      "preconditions": "Editors with access to the figure's dataview; works before the figure's reader setting is on. `figure` is the PAGE:SLOT:ID key and `key` the mark's value. Waits for the job and returns the handle (which descriptor is the rows, the count and the total) with the results: up to 500 rows.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardFigureRowsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_rows",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.figure-intent",
      "command_path": "dashboard figure-intent",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardFigureIntentResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/figure-intent",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "FigureIntent",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardFigureIntentResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.figure_intent",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dashboard.filter.add",
      "command_path": "dashboard filter add",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Adds a filter control on one column to ONE board so the viewer picks the value (Region, Month, Status). Use this for any \"per <column>\" or \"by <column>\" ask instead of building a board per value. --input: \"field\" (a column of the board's data, required), optional \"control\" (multi, dropdown, chips, search for a category; range for a number or date; the backend rejects a control the column type does not take), \"label\", \"default\" (list of values selected at first). A second add on the same field replaces the first. Reads the draft canvas, edits filters[], saves it; returns the declared filters, sequence and bake_job_id (dashboard job wait). Example: --input '{\"field\": \"Region\", \"control\": \"dropdown\", \"label\": \"Region\"}'.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Adds a filter control on one column to ONE board so the viewer picks the value (Region, Month, Status). Use this for any \"per <column>\" or \"by <column>\" ask instead of building a board per value. --input: \"field\" (a column of the board's data, required), optional \"control\" (multi, dropdown, chips, search for a category; range for a number or date; the backend rejects a control the column type does not take), \"label\", \"default\" (list of values selected at first). A second add on the same field replaces the first. Reads the draft canvas, edits filters[], saves it; returns the declared filters, sequence and bake_job_id (dashboard job wait). Example: --input '{\"field\": \"Region\", \"control\": \"dropdown\", \"label\": \"Region\"}'.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DashboardFilterResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dashboard.filter.list",
      "command_path": "dashboard filter list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists the filter controls a board declares ({field, control, label, default}); read it before adding one.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Lists the filter controls a board declares ({field, control, label, default}); read it before adding one.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardFilterResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dashboard.filter.remove",
      "command_path": "dashboard filter remove",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes the filter control on one column from a board; fails and names the declared filters when the column has none. --input: {\"field\": COLUMN}. Returns the filters that remain, sequence and bake_job_id.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DashboardFilterResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Removes the filter control on one column from a board; fails and names the declared filters when the column has none. --input: {\"field\": COLUMN}. Returns the filters that remain, sequence and bake_job_id.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DashboardFilterResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.format-preview",
      "command_path": "dashboard format-preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Dry run of a format switch on a copy of the canvas: what carries over, what the new style adds, and what the target cannot show (not_shown). Nothing is saved. Take style names from dashboard style preset list.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardFormatPreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/format-preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FormatPreview",
      "pagination_policy": "none",
      "preconditions": "Dry run of a format switch on a copy of the canvas: what carries over, what the new style adds, and what the target cannot show (not_shown). Nothing is saved. Take style names from dashboard style preset list.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardFormatPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.format_preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.gallery.get",
      "command_path": "dashboard gallery get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "One card of the public template gallery. A user-saved template, or a curated one that is not live, answers 404 exactly as an unknown slug does.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGalleryGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/public/templates/{slug}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardPublicTemplate",
      "pagination_policy": "none",
      "preconditions": "One card of the public template gallery. A user-saved template, or a curated one that is not live, answers 404 exactly as an unknown slug does.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardGalleryGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.gallery_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.gallery.list",
      "command_path": "dashboard gallery list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "The public template gallery as data: curated, live templates only, with copy, taxonomy labels, thumbnail_ref and viewer_url, and the function/industry facets with counts. No internal ids. Optional function or industry narrow it; an unknown facet answers 404. To use one in this workspace, use dashboard template list and dashboard templates use.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGalleryListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/public/templates",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardPublicTemplates",
      "pagination_policy": "single_page",
      "preconditions": "The public template gallery as data: curated, live templates only, with copy, taxonomy labels, thumbnail_ref and viewer_url, and the function/industry facets with counts. No internal ids. Optional function or industry narrow it; an unknown facet answers 404. To use one in this workspace, use dashboard template list and dashboard templates use.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardGalleryListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.gallery_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.get",
      "command_path": "dashboard get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.get-by-url",
      "command_path": "dashboard get-by-url",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "URL is a slug, not an arbitrary request URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardGetByUrlResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardByUrl",
      "pagination_policy": "none",
      "preconditions": "URL is a slug, not an arbitrary request URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardGetByUrlResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_by_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.import-workbook",
      "command_path": "dashboard import-workbook",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ImportDatasetResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/import/dataset",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ImportWorkbookDataset",
      "pagination_policy": "none",
      "preconditions": "These take a workbook file from the local disk. Inside the Mammoth app the user's file cannot reach the agent: send the user to the dashboard import page at /workspaces/{workspace_id}/publish/import (Publish → Import), where they upload the .pbix/.twb/.twbx themselves.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ImportDatasetResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.import_workbook",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.job-by-url",
      "command_path": "dashboard job-by-url",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardJobByUrlResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/jobs/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardJob",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL, JOB_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardJobByUrlResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.job_by_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.list",
      "command_path": "dashboard list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListDashboard",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.live-chart.audience",
      "command_path": "dashboard live-chart audience",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes who can open the live chart. Pass the new audience in --input. Confirms the dashboard id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartAudienceResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /dashboards/v3/live-charts/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ChangeAudience",
      "pagination_policy": "none",
      "preconditions": "Changes who can open the live chart. Pass the new audience in --input. Confirms the dashboard id.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardLiveChartAudienceResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_audience",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "start_or_wait",
      "canonical_command": "dashboard.live-chart.create",
      "command_path": "dashboard live-chart create",
      "confirmation": "none",
      "contract": {
        "async": "start_or_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Turns a chart made in an agent chat into a live chart on a dashboard of its own. Creates a dashboard, then waits for its bake job (bounded by --job-timeout) and reads the chart back; making the same chat chart live twice returns the first chart with no job. --project names the project the chart belongs to; without it the server uses the source view's project.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/live-charts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateLiveChart",
      "pagination_policy": "none",
      "preconditions": "Turns a chart made in an agent chat into a live chart on a dashboard of its own. Creates a dashboard, then waits for its bake job (bounded by --job-timeout) and reads the chart back; making the same chat chart live twice returns the first chart with no job. --project names the project the chart belongs to; without it the server uses the source view's project.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardLiveChartCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.live-chart.get",
      "command_path": "dashboard live-chart get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/live-charts/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetLiveChart",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardLiveChartGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.live-chart.list",
      "command_path": "dashboard live-chart list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/live-charts",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListLiveCharts",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardLiveChartListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.live-chart.placement",
      "command_path": "dashboard live-chart placement",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Records where a live chart is shown (an embed or a page).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardLiveChartPlacementResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/live-charts/{dashboard_id}/placements",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RecordPlacement",
      "pagination_policy": "none",
      "preconditions": "Records where a live chart is shown (an embed or a page).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardLiveChartPlacementResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_placement",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.live-chart.usage",
      "command_path": "dashboard live-chart usage",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardLiveChartUsageResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/live-charts/{dashboard_id}/usage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUsage",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardLiveChartUsageResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.live_chart_usage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.oembed",
      "command_path": "dashboard oembed",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOembedResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/oembed",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "Oembed",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardOembedResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.oembed",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.og-card",
      "command_path": "dashboard og-card",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOgCardResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/og-card",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "OgCard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardOgCardResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.og_card",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.own-data.accept",
      "command_path": "dashboard own-data accept",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Applies the proposed version to the board, which changes it. choice is proposal (default), partial or reshape; exclude lists change ids of added items to leave out. Waits for the applying job.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataAcceptResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/{dashboard_id}/own-data/accept",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AcceptOwnData",
      "pagination_policy": "none",
      "preconditions": "Applies the proposed version to the board, which changes it. choice is proposal (default), partial or reshape; exclude lists change ids of added items to leave out. Waits for the applying job.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardOwnDataAcceptResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_accept",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.own-data.dismiss",
      "command_path": "dashboard own-data dismiss",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Drops the pending 'use my data' run. The board is not changed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataDismissResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/{dashboard_id}/own-data/dismiss",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DismissOwnData",
      "pagination_policy": "none",
      "preconditions": "Drops the pending 'use my data' run. The board is not changed.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardOwnDataDismissResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_dismiss",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.own-data.preview",
      "command_path": "dashboard own-data preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The adapted board as proposed, baked but not saved.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOwnDataPreviewResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/{dashboard_id}/own-data/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "PreviewOwnData",
      "pagination_policy": "none",
      "preconditions": "Read-only. The adapted board as proposed, baked but not saved.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardOwnDataPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.own-data.start",
      "command_path": "dashboard own-data start",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Fits a template board to your own data and waits for the proposal. Give exactly one of dataview_id, dataset_id or ingest_job_id. The board is not changed; read the proposal with dashboard own-data status and preview, then accept or dismiss. Replaces any pending run. Uses an AI call.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardOwnDataStartResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/{dashboard_id}/own-data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "StartOwnData",
      "pagination_policy": "none",
      "preconditions": "Fits a template board to your own data and waits for the proposal. Give exactly one of dataview_id, dataset_id or ingest_job_id. The board is not changed; read the proposal with dashboard own-data status and preview, then accept or dismiss. Replaces any pending run. Uses an AI call.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardOwnDataStartResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_start",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.own-data.status",
      "command_path": "dashboard own-data status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The board's pending 'use my data' run: status and stage, and once fitted the proposal. status null means nothing is pending.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardOwnDataStatusResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/{dashboard_id}/own-data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetOwnData",
      "pagination_policy": "none",
      "preconditions": "Read-only. The board's pending 'use my data' run: status and stage, and once fitted the proposal. status null means nothing is pending.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardOwnDataStatusResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.own_data_status",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.page.plan",
      "command_path": "dashboard page plan",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPagePlanResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/plan-page",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PlanPage",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPagePlanResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.page_plan",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "returns_job",
      "canonical_command": "dashboard.pages.add",
      "command_path": "dashboard pages add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "returns_job",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "To add or change content by description, use dashboard chat edit instead. Requires --yes --confirm DASHBOARD_ID. body.params.pages is a list of PageAdd objects: {title, focus: {measure, dim, kpis: [...]}, charts: [{kind, title, dim, measure, agg}]}; the schema example''s {} entry is not a usable page. The route runs through the LLM control guard: in the ILG simulation it dropped unit.prefix on a money card (\"nothing in this data says which currency\") that dashboard canvas save had kept, and reports that in data.message.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPagesAddResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/{dashboard_id}/pages",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddPages",
      "pagination_policy": "none",
      "preconditions": "To add or change content by description, use dashboard chat edit instead. Requires --yes --confirm DASHBOARD_ID. body.params.pages is a list of PageAdd objects: {title, focus: {measure, dim, kpis: [...]}, charts: [{kind, title, dim, measure, agg}]}; the schema example''s {} entry is not a usable page. The route runs through the LLM control guard: in the ILG simulation it dropped unit.prefix on a money card (\"nothing in this data says which currency\") that dashboard canvas save had kept, and reports that in data.message.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPagesAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.add_pages",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.pbix-assess",
      "command_path": "dashboard pbix-assess",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Assesses a workbook the web app already attached (ATTACHMENT_ID): waits for the job and returns its result. Use dashboard assess-pbix for a local file.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPbixAssessResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/attachments/{attachment_id}/assess",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AttachmentAssess",
      "pagination_policy": "none",
      "preconditions": "Read-only. Assesses a workbook the web app already attached (ATTACHMENT_ID): waits for the job and returns its result. Use dashboard assess-pbix for a local file.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPbixAssessResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_assess",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.pbix-intent",
      "command_path": "dashboard pbix-intent",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Reads a Power BI workbook the web app already attached (ATTACHMENT_ID) against one of your views (TARGET_DATAVIEW_ID), waits for the job and returns its result: intent, coverage {mapped, total}, unmapped_visuals, field_map and target_dataview_id, or {rejected, source}. No dashboard or sample data is made. Uploading the attachment is done in the web app.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPbixIntentResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/attachments/{attachment_id}/intent",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "AttachmentIntent",
      "pagination_policy": "none",
      "preconditions": "Read-only. Reads a Power BI workbook the web app already attached (ATTACHMENT_ID) against one of your views (TARGET_DATAVIEW_ID), waits for the job and returns its result: intent, coverage {mapped, total}, unmapped_visuals, field_map and target_dataview_id, or {rejected, source}. No dashboard or sample data is made. Uploading the attachment is done in the web app.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPbixIntentResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.attachment_intent",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.pdf.export",
      "command_path": "dashboard pdf export",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Backend requires params.data to be the browser-hydrated DashboardData map (pre-rendered widget results); the server stores only query descriptors and cannot rebuild it, so a PDF cannot be produced from the CLI alone; point the user to the board's Download PDF in the app.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPdfExportResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/pdf",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExportPdf",
      "pagination_policy": "none",
      "preconditions": "Backend requires params.data to be the browser-hydrated DashboardData map (pre-rendered widget results); the server stores only query descriptors and cannot rebuild it, so a PDF cannot be produced from the CLI alone; point the user to the board's Download PDF in the app.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPdfExportResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.pdf_export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.pdf-artifact",
      "command_path": "dashboard pdf-artifact",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPdfArtifactResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/pdf/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPdfArtifact",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, JOB_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPdfArtifactResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.pdf_artifact",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.published.canvas",
      "command_path": "dashboard published canvas",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedCanvasResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/canvas",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCanvasPublished",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedCanvasResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_canvas",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.published.data",
      "command_path": "dashboard published data",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedDataResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/url/{url}/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DescriptorDataByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPublishedDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.published.drill",
      "command_path": "dashboard published drill",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Any viewer of the published board, under the viewer's row-level scope; 403 drill_disabled until the figure's reader setting lets readers drill. Same body as `dashboard figure drill`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedDrillResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/url/{url}/drill",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FigureDrillByUrl",
      "pagination_policy": "none",
      "preconditions": "Any viewer of the published board, under the viewer's row-level scope; 403 drill_disabled until the figure's reader setting lets readers drill. Same body as `dashboard figure drill`.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedDrillResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_drill",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.published.og-card",
      "command_path": "dashboard published og-card",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedOgCardResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/og-card",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "OgCardByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedOgCardResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_og_card",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.published.pdf.export",
      "command_path": "dashboard published pdf export",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedPdfExportResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/url/{url}/pdf",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExportPdfByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPublishedPdfExportResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_pdf_export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.published.pdf-artifact",
      "command_path": "dashboard published pdf-artifact",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL, JOB_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedPdfArtifactResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/pdf/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPdfArtifactByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL, JOB_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedPdfArtifactResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_pdf_artifact",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dashboard.published.rows",
      "command_path": "dashboard published rows",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Signed-in readers only, under their row-level scope; 403 rows_disabled until the figure's reader setting is on, and refused on public links and signed embeds. Same body as `dashboard figure rows`.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedRowsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/url/{url}/rows",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FigureRowsByUrl",
      "pagination_policy": "none",
      "preconditions": "Signed-in readers only, under their row-level scope; 403 rows_disabled until the figure's reader setting is on, and refused on public links and signed embeds. Same body as `dashboard figure rows`.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedRowsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_rows",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.published.share-page",
      "command_path": "dashboard published share-page",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedSharePageResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/share",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SharePageByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedSharePageResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_share_page",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.published.video.export",
      "command_path": "dashboard published video export",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedVideoExportResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/url/{url}/video",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExportVideoByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPublishedVideoExportResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_video_export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.published.video-artifact",
      "command_path": "dashboard published video-artifact",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardPublishedVideoArtifactResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/url/{url}/video.mp4",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "VideoByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardPublishedVideoArtifactResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_video_artifact",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.published-data-by-url",
      "command_path": "dashboard published-data-by-url",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardPublishedDataByUrlResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/url/{url}/getPublishData",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "GetPublishDataFromSqlByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardPublishedDataByUrlResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.published_data_by_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.qa.ask",
      "command_path": "dashboard qa ask",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaAskResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/ask",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "Ask",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaAskResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_ask",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.comment.create",
      "command_path": "dashboard qa comment create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaCommentCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/comments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3AddComment",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaCommentCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_comment_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.comment.delete",
      "command_path": "dashboard qa comment delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, COMMENT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaCommentDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/{dashboard_id}/qa/sessions/{session_id}/comments/{comment_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteComment",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, COMMENT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaCommentDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_comment_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.feedback",
      "command_path": "dashboard qa feedback",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, MESSAGE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaFeedbackResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/messages/{message_id}/feedback",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3QaFeedback",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID, MESSAGE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaFeedbackResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_feedback",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.qa.insights",
      "command_path": "dashboard qa insights",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The questions viewers asked on the board over the last days (7, 30 or 90; default 7), grouped by their text, with feedback and unanswered counts and the measure and dimension each answer was about. Editors only. Nobody is named: no user, session or name is returned, and editors' own questions are left out.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaInsightsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/qa/insights",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3QaInsights",
      "pagination_policy": "none",
      "preconditions": "The questions viewers asked on the board over the last days (7, 30 or 90; default 7), grouped by their text, with feedback and unanswered counts and the measure and dimension each answer was about. Editors only. Nobody is named: no user, session or name is returned, and editors' own questions are left out.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardQaInsightsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_insights",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.create",
      "command_path": "dashboard qa session create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/qa/sessions",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSessionCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.delete",
      "command_path": "dashboard qa session delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/{dashboard_id}/qa/sessions/{session_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DashboardV3DeleteSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSessionDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.fork",
      "command_path": "dashboard qa session fork",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionForkResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/fork",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ForkSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSessionForkResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_fork",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.get",
      "command_path": "dashboard qa session get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSessionGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/qa/sessions/{session_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardQaSessionGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.list",
      "command_path": "dashboard qa session list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSessionListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/qa/sessions",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3ListSessions",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardQaSessionListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.rename",
      "command_path": "dashboard qa session rename",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionRenameResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/qa/sessions/{session_id}/title",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RenameSession",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSessionRenameResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_rename",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.session.set-visibility",
      "command_path": "dashboard qa session set-visibility",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSessionSetVisibilityResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/qa/sessions/{session_id}/visibility",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3SetVisibility",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID, SESSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSessionSetVisibilityResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_session_set_visibility",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.qa.settings.get",
      "command_path": "dashboard qa settings get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardQaSettingsGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/qa/settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3GetQaSettings",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardQaSettingsGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_settings_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.qa.settings.set",
      "command_path": "dashboard qa settings set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQaSettingsSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/qa/settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3SetQaSettings",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQaSettingsSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.qa_settings_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.query",
      "command_path": "dashboard query",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardQueryResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/query",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AdhocQuery",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardQueryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.query",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.restore",
      "command_path": "dashboard restore",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardRestoreResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RestoreDashboard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardRestoreResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.rls.assignment.list",
      "command_path": "dashboard rls assignment list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsAssignmentListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/rls/assignments",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListRlsAssignments",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardRlsAssignmentListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_assignment_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.rls.assignment.set",
      "command_path": "dashboard rls assignment set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardRlsAssignmentSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/{dashboard_id}/rls/assignments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetRlsAssignments",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardRlsAssignmentSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_assignment_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.rls.column.list",
      "command_path": "dashboard rls column list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsColumnListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/rls/columns",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetRlsColumns",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardRlsColumnListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_column_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.rls.value.list",
      "command_path": "dashboard rls value list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardRlsValueListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/rls/values",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetRlsDistinctValues",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardRlsValueListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rls_value_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.share",
      "command_path": "dashboard share",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardShareResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /dashboards/{dashboard_id}/share",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "ShareDashboard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardShareResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.share",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.signature.create",
      "command_path": "dashboard signature create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/signatures",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateSignature",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardSignatureCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.signature.delete",
      "command_path": "dashboard signature delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SIGNATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/signatures/{signature_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteSignature",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SIGNATURE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardSignatureDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.signature.list",
      "command_path": "dashboard signature list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSignatureListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/signatures",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSignatures",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardSignatureListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.signature.update",
      "command_path": "dashboard signature update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SIGNATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardSignatureUpdateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/v3/signatures/{signature_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateSignature",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SIGNATURE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardSignatureUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.signature_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.source.list",
      "command_path": "dashboard source list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Some servers answer this with HTTP 500.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSourceListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/sources",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetDashboardSources",
      "pagination_policy": "single_page",
      "preconditions": "Some servers answer this with HTTP 500.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardSourceListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.get_sources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.style.custom.create",
      "command_path": "dashboard style custom create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/styles/custom",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateCustomStyle",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleCustomCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.style.custom.delete",
      "command_path": "dashboard style custom delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: STYLE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/styles/custom/{style_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteCustomStyle",
      "pagination_policy": "none",
      "preconditions": "Required inputs: STYLE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleCustomDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.style.custom.list",
      "command_path": "dashboard style custom list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleCustomListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/styles/custom",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListCustomStyles",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardStyleCustomListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.style.custom.update",
      "command_path": "dashboard style custom update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: STYLE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleCustomUpdateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/v3/styles/custom/{style_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateCustomStyle",
      "pagination_policy": "none",
      "preconditions": "Required inputs: STYLE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleCustomUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_custom_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.style.default.get",
      "command_path": "dashboard style default get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleDefaultGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/styles/default",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDefaultStyle",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardStyleDefaultGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_default_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.style.default.set",
      "command_path": "dashboard style default set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleDefaultSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/v3/styles/default",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetDefaultStyle",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleDefaultSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_default_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.style.derive",
      "command_path": "dashboard style derive",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleDeriveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/styles/derive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DeriveStyle",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleDeriveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_derive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.style.extract-brand",
      "command_path": "dashboard style extract-brand",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardStyleExtractBrandResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/styles/extract-brand",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExtractBrand",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardStyleExtractBrandResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_extract_brand",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.style.preset.list",
      "command_path": "dashboard style preset list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStylePresetListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/styles/presets",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListStylePresets",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardStylePresetListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_preset_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.style.token.list",
      "command_path": "dashboard style token list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardStyleTokenListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/styles/tokens",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetStyleTokens",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardStyleTokenListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.style_token_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.suggestion.list",
      "command_path": "dashboard suggestion list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSuggestionListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/suggestions",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardSuggestions",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardSuggestionListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.suggestion_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.swap-data",
      "command_path": "dashboard swap-data",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ObjectJobSchema",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/{dashboard_id}/swap-data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SwapDashboardData",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ObjectJobSchema",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.swap_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.swap-fit",
      "command_path": "dashboard swap-fit",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only check before dashboard swap-data: scores the dashboard (the positional) against up to 60 candidate dataviews, in the order given. Pass target_dataview_ids in --input. Each fit carries a grade (matched, total, reasons) or a skipped reason; too_large means the dataset was not profiled inline, so repeat with include_over_budget for that one. sample_dataview_ids names the template sample data to avoid. No model call, nothing written.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardSwapFitResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/swap/fit",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SwapFit",
      "pagination_policy": "none",
      "preconditions": "Read-only check before dashboard swap-data: scores the dashboard (the positional) against up to 60 candidate dataviews, in the order given. Pass target_dataview_ids in --input. Each fit carries a grade (matched, total, reasons) or a skipped reason; too_large means the dataset was not profiled inline, so repeat with include_over_budget for that one. sample_dataview_ids names the template sample data to avoid. No model call, nothing written.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardSwapFitResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.swap_fit",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.tags.delete",
      "command_path": "dashboard tags delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/tags/{tag_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDashboardTag",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TAG_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTagsDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.delete_tag",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.tags.list",
      "command_path": "dashboard tags list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTagsListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/tags",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListDashboardTags",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardTagsListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.list_tags",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.tags.merge",
      "command_path": "dashboard tags merge",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsMergeResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "POST /dashboards/tags/{tag_id}/merge",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "MergeDashboardTags",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TAG_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTagsMergeResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.merge_tag",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.tags.rename",
      "command_path": "dashboard tags rename",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TAG_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsRenameResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /dashboards/tags/{tag_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RenameDashboardTag",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TAG_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTagsRenameResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.rename_tag",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dashboard.tags.set",
      "command_path": "dashboard tags set",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTagsSetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /dashboards/{dashboard_id}/tags",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SetDashboardTags",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTagsSetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.set_tags",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.template.apply",
      "command_path": "dashboard template apply",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateApplyResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/templates/apply",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ApplyTemplate",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateApplyResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_apply",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.create",
      "command_path": "dashboard template create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "dashboard_id must name a dashboard whose widgets bind dataset columns; a blank dashboard fails with \"None of the columns this template binds are in the dataset\". Build the dashboard first (dashboard create, then widgets), then save it as a template.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateCreateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/templates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SaveTemplate",
      "pagination_policy": "none",
      "preconditions": "dashboard_id must name a dashboard whose widgets bind dataset columns; a blank dashboard fails with \"None of the columns this template binds are in the dataset\". Build the dashboard first (dashboard create, then widgets), then save it as a template.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.delete",
      "command_path": "dashboard template delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateDeleteResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DashboardV3DeleteTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.template.fit",
      "command_path": "dashboard template fit",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateFitResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/fit",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "FitTemplates",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardTemplateFitResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_fit",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.template.get",
      "command_path": "dashboard template get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3GetTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardTemplateGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.template.list",
      "command_path": "dashboard template list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3ListTemplates",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardTemplateListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.preview",
      "command_path": "dashboard template preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplatePreviewResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/templates/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PreviewTemplate",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplatePreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.rename",
      "command_path": "dashboard template rename",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateRenameResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /dashboards/v3/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RenameTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateRenameResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_rename",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.resolve-mapping",
      "command_path": "dashboard template resolve-mapping",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateResolveMappingResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/templates/resolve-mapping",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ResolveTemplateMapping",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateResolveMappingResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_resolve_mapping",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.thumbnail.clear",
      "command_path": "dashboard template thumbnail clear",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes a saved template's picture (owner or workspace admin); its card falls back to the og-card. ok is false when there was no picture.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateThumbnailClearResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/templates/{slug}/thumbnail",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DashboardV3DeleteTemplateThumbnail",
      "pagination_policy": "none",
      "preconditions": "Removes a saved template's picture (owner or workspace admin); its card falls back to the og-card. ok is false when there was no picture.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateThumbnailClearResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_clear",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.template.thumbnail.get",
      "command_path": "dashboard template thumbnail get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The picture a template's card shows, as content_type and content_base64. A template with no picture answers 404; that is an ordinary state and its card falls back to the og-card.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardTemplateThumbnailGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/{slug}/thumbnail",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3TemplateThumbnail",
      "pagination_policy": "none",
      "preconditions": "The picture a template's card shows, as content_type and content_base64. A template with no picture answers 404; that is an ordinary state and its card falls back to the og-card.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardTemplateThumbnailGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.template.thumbnail.set",
      "command_path": "dashboard template thumbnail set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Replaces the picture of a SAVED workspace template (owner or workspace admin; curated templates are not writable). PNG, JPEG or WebP read from the file's content, 1 MB at most. The file comes from the local disk.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTemplateThumbnailSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /dashboards/v3/templates/{slug}/thumbnail",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3PutTemplateThumbnail",
      "pagination_policy": "none",
      "preconditions": "Replaces the picture of a SAVED workspace template (owner or workspace admin; curated templates are not writable). PNG, JPEG or WebP read from the file's content, 1 MB at most. The file comes from the local disk.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTemplateThumbnailSetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.template_thumbnail_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dashboard.templates.pending",
      "command_path": "dashboard templates pending",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "PendingTemplateResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/templates/pending",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DashboardV3TakePendingTemplate",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "PendingTemplateResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.take_pending_template",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.templates.use",
      "command_path": "dashboard templates use",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SLUG.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ObjectJobSchema | JobResponse",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/templates/{slug}/use",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UseTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SLUG.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ObjectJobSchema | JobResponse",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.use_template",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.trash",
      "command_path": "dashboard trash",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardTrashResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TrashDashboard",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardTrashResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.trash",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.unpublished",
      "command_path": "dashboard unpublished",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardUnpublishedResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/unpublished",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUnpublishedChanges",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardUnpublishedResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.unpublished",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "returns_job",
      "canonical_command": "dashboard.update",
      "command_path": "dashboard update",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Updates dashboard fields; read the dashboard first (`dashboard get`).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardUpdateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /dashboards/{dashboard_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditDashboard",
      "pagination_policy": "none",
      "preconditions": "Updates dashboard fields; read the dashboard first (`dashboard get`).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.v3.generate",
      "command_path": "dashboard v3 generate",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "This is how to make a dashboard: it builds and bakes a whole board from one sentence on one view. Input {\"body\": {\"params\": {\"intent\": \"<what the board should show>\", \"dataview_id\": VIEW_ID, \"title\": \"<optional name>\"}}}; waits (about 30 s) and returns the baked canvas, plus dashboard_link and values: the evaluated number of every KPI card and tile (one descriptor-data read of the baked board), so compare them with what you saw in the data before you report. Change it afterwards with dashboard chat edit. dashboard create-blank is only for authoring a canvas by hand.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardV3GenerateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/v3/generate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "GenerateDashboardV3",
      "pagination_policy": "none",
      "preconditions": "This is how to make a dashboard: it builds and bakes a whole board from one sentence on one view. Input {\"body\": {\"params\": {\"intent\": \"<what the board should show>\", \"dataview_id\": VIEW_ID, \"title\": \"<optional name>\"}}}; waits (about 30 s) and returns the baked canvas, plus dashboard_link and values: the evaluated number of every KPI card and tile (one descriptor-data read of the baked board), so compare them with what you saw in the data before you report. Change it afterwards with dashboard chat edit. dashboard create-blank is only for authoring a canvas by hand.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardV3GenerateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.v3_generate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.video.export",
      "command_path": "dashboard video export",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardVideoExportResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/video",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExportVideo",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardVideoExportResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.video_export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dashboard.video-state",
      "command_path": "dashboard video-state",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DashboardVideoStateResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/{dashboard_id}/video-state",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetVideoState",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DashboardVideoStateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.video_state",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.widget-data",
      "command_path": "dashboard widget-data",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DASHBOARD_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardWidgetDataResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/{dashboard_id}/widgets/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "BulkWidgetData",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DASHBOARD_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardWidgetDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.widget_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "dashboard.widget-data-by-url",
      "command_path": "dashboard widget-data-by-url",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: URL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DashboardWidgetDataByUrlResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /dashboards/url/{url}/widgets/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "BulkWidgetDataByUrl",
      "pagination_policy": "none",
      "preconditions": "Required inputs: URL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DashboardWidgetDataByUrlResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.widget_data_by_url",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.batch-data",
      "command_path": "dataset batch-data",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Dataset and batch parent are explicit; limit is 0..100 and offset is non-negative.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetBatchDataResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/batches/{batch_id}/data",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetBatchData",
      "pagination_policy": "offset",
      "preconditions": "Dataset and batch parent are explicit; limit is 0..100 and offset is non-negative.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetBatchDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_batch_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.broken-rows.list",
      "command_path": "dataset broken-rows list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Returns the first 100 lines the upload could not parse, each with its line number, upload (batch_id) and why it does not fit the columns; row_count is the total. A dataset not made from a file upload has none.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetBrokenRowsListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/unstructured_rows",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUnstructuredRows",
      "pagination_policy": "none",
      "preconditions": "Returns the first 100 lines the upload could not parse, each with its line number, upload (batch_id) and why it does not fit the columns; row_count is the total. A dataset not made from a file upload has none.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetBrokenRowsListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_unstructured_rows",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.broken-rows.resolve",
      "command_path": "dataset broken-rows resolve",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "op \"add\" takes each corrected line (line_num, batch_id and the original line from dataset broken-rows list, edited so its column count matches) into the dataset; op \"remove\" discards the lines for good. Returns a job: run job wait on it, then read broken-rows list (row_count 0 and dataset status ready mean it is finished). Confirm with the user first, and say that discarded lines do not come back.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBrokenRowsResolveResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/unstructured_rows",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "PatchUnstructuredRows",
      "pagination_policy": "none",
      "preconditions": "op \"add\" takes each corrected line (line_num, batch_id and the original line from dataset broken-rows list, edited so its column count matches) into the dataset; op \"remove\" discards the lines for good. Returns a job: run job wait on it, then read broken-rows list (row_count 0 and dataset status ready mean it is finished). Confirm with the user first, and say that discarded lines do not come back.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetBrokenRowsResolveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.resolve_unstructured_rows",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.bulk-delete",
      "command_path": "dataset bulk-delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes every listed dataset for good and cannot be undone. A dataset that another view uses as a lookup or join source is kept, and the result says so. List them first (`dataset list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDatasets",
      "pagination_policy": "none",
      "preconditions": "Deletes every listed dataset for good and cannot be undone. A dataset that another view uses as a lookup or join source is kept, and the result says so. List them first (`dataset list`). Needs a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.bulk_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dataset.bulk-update",
      "command_path": "dataset bulk-update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetBulkUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateDatasets",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]; reserved, not registered.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetBulkUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.bulk_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.column-stats",
      "command_path": "dataset column-stats",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs a project. Use this instead of profiling each view when the question spans datasets (\"missing values\", \"blanks\", \"data quality across the project\"): one call returns every dataset's columns with their blank count and share, type and distinct count, from stats stored at the last load or pipeline run. Rank columns by blank_pct (or blank_count) and name the worst dataset and column.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetColumnStatsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/column-stats",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetProjectColumnStats",
      "pagination_policy": "none",
      "preconditions": "Needs a project. Use this instead of profiling each view when the question spans datasets (\"missing values\", \"blanks\", \"data quality across the project\"): one call returns every dataset's columns with their blank count and share, type and distinct count, from stats stored at the last load or pipeline run. Rank columns by blank_pct (or blank_count) and name the worst dataset and column.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetColumnStatsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.column_stats",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "dataset.create",
      "command_path": "dataset create",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "ds_creation_type=weburl (dataset_spec.url), clone, or cloud (a file, REST API or database query from a connection); the command waits for the job and returns the new dataset_id. A weburl dataset keeps its link and can be refreshed on demand (dataset refresh DATASET_ID --yes, or Refresh from URL in the web app; a single CSV only), but never on a schedule: automation's run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); for a scheduled pull from a URL use the REST API connector. Say so rather than scheduling a refresh for it. The result's name is the dataset's real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {\"ds_creation_type\": \"clone\", \"dataset_spec\": {\"ds_name\": NEW_NAME, \"source_ds_id\": ID, \"clone_dataview_ids\": [DEFAULT_VIEW_ID], \"exclude_data\": false}}, DEFAULT_VIEW_ID being the id in dataset's `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"sftp\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"file_path\": PATH_ON_SERVER, \"data_pull_file\": \"Pull same file\"}}}. data_pull_file is a string and may be left out, which means \"Pull same file\" (what the web app does); its only other value is \"Pull next file based on name pattern\", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server's reason; the recipe is recipes/file-import.md. To import from a REST API or Elasticsearch: the connection must exist first (connector connection create generic_rest_api, in the same project); try the query with connector ds-config create (data_sample, creates no dataset; connector connection query takes SQL only and refuses a REST config); then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"generic_rest_api\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"table_name\": TABLE, \"query\": \"<JSON string of the endpoint config>\"}, \"schedule_properties\": {\"schedule_type\": \"moment\", \"first_pull_at\": \"now\", \"on_refresh_action\": \"replace\"}, \"recurrence_info\": {\"interval\": 1, \"start_at\": \"<future ISO time>\"}}}. schedule_properties and recurrence_info are required (without them the job fails with Invalid parameters); on_refresh_action combine appends every refresh, so rows duplicate. The recipe is recipes/rest-api-import.md. To make a dataset from a database query (SQL Server, MySQL, Postgres, ...): connector connection create for the database, try the SELECT with connector connection query (read-only, saves nothing), then connector ds-config create CONNECTOR_KEY CONNECTION_KEY with {\"query\": SELECT, \"table\": NAME}; the recipe is recipes/database-import.md. Other ds_creation_type values and dataset_spec shapes: variants beyond the documented path are not qualified.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateDatasets",
      "pagination_policy": "none",
      "preconditions": "ds_creation_type=weburl (dataset_spec.url), clone, or cloud (a file, REST API or database query from a connection); the command waits for the job and returns the new dataset_id. A weburl dataset keeps its link and can be refreshed on demand (dataset refresh DATASET_ID --yes, or Refresh from URL in the web app; a single CSV only), but never on a schedule: automation's run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); for a scheduled pull from a URL use the REST API connector. Say so rather than scheduling a refresh for it. The result's name is the dataset's real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {\"ds_creation_type\": \"clone\", \"dataset_spec\": {\"ds_name\": NEW_NAME, \"source_ds_id\": ID, \"clone_dataview_ids\": [DEFAULT_VIEW_ID], \"exclude_data\": false}}, DEFAULT_VIEW_ID being the id in dataset's `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"sftp\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"file_path\": PATH_ON_SERVER, \"data_pull_file\": \"Pull same file\"}}}. data_pull_file is a string and may be left out, which means \"Pull same file\" (what the web app does); its only other value is \"Pull next file based on name pattern\", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server's reason; the recipe is recipes/file-import.md. To import from a REST API or Elasticsearch: the connection must exist first (connector connection create generic_rest_api, in the same project); try the query with connector ds-config create (data_sample, creates no dataset; connector connection query takes SQL only and refuses a REST config); then {\"ds_creation_type\": \"cloud\", \"dataset_spec\": {\"connector_key\": \"generic_rest_api\", \"connection_key\": KEY, \"query_properties\": {\"ds_name\": NAME, \"table_name\": TABLE, \"query\": \"<JSON string of the endpoint config>\"}, \"schedule_properties\": {\"schedule_type\": \"moment\", \"first_pull_at\": \"now\", \"on_refresh_action\": \"replace\"}, \"recurrence_info\": {\"interval\": 1, \"start_at\": \"<future ISO time>\"}}}. schedule_properties and recurrence_info are required (without them the job fails with Invalid parameters); on_refresh_action combine appends every refresh, so rows duplicate. The recipe is recipes/rest-api-import.md. To make a dataset from a database query (SQL Server, MySQL, Postgres, ...): connector connection create for the database, try the SELECT with connector connection query (read-only, saves nothing), then connector ds-config create CONNECTOR_KEY CONNECTION_KEY with {\"query\": SELECT, \"table\": NAME}; the recipe is recipes/database-import.md. Other ds_creation_type values and dataset_spec shapes: variants beyond the documented path are not qualified.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.create-from-pdf",
      "command_path": "dataset create-from-pdf",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Add table_list (table indices to extract) to the input: {\"file_name\": \"report.pdf\", \"table_list\": [0]}. The API refuses a call with no table_list. user_instruction cannot be combined with table_list.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetCreateFromPdfResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets-from-pdf",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateDatasetFromPdf",
      "pagination_policy": "none",
      "preconditions": "Add table_list (table indices to extract) to the input: {\"file_name\": \"report.pdf\", \"table_list\": [0]}. The API refuses a call with no table_list. user_instruction cannot be combined with table_list.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetCreateFromPdfResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.create_from_pdf",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "dataset.data",
      "command_path": "dataset data",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDataResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDatasetData",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dataset.definition.add",
      "command_path": "dataset definition add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Saves what a term means for this dataset: term (1-60 characters) and definition (1-300 characters) from --input. A definition is shared by everyone's chats on this dataset, so the user confirms each save. Save one only when the user states what a term means for this data, not to answer a one-off question. Write the definition in terms of the dataset's real column names. A definition for an existing term (any case) replaces it; at most 20 per dataset. The project's definitions already appear in every turn's context, so there is no need to list them before answering.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDefinitionAddResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddDatasetDefinition",
      "pagination_policy": "none",
      "preconditions": "Saves what a term means for this dataset: term (1-60 characters) and definition (1-300 characters) from --input. A definition is shared by everyone's chats on this dataset, so the user confirms each save. Save one only when the user states what a term means for this data, not to answer a one-off question. Write the definition in terms of the dataset's real column names. A definition for an existing term (any case) replaces it; at most 20 per dataset. The project's definitions already appear in every turn's context, so there is no need to list them before answering.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetDefinitionAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.add_definition",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.definition.list",
      "command_path": "dataset definition list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists what terms mean for this dataset (id, term, definition), shared by everyone's chats on it. The project's definitions already appear in every turn's context, so there is no need to list them before answering; list them to find the id to remove.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDefinitionListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDatasetDefinitions",
      "pagination_policy": "none",
      "preconditions": "Lists what terms mean for this dataset (id, term, definition), shared by everyone's chats on it. The project's definitions already appear in every turn's context, so there is no need to list them before answering; list them to find the id to remove.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetDefinitionListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.list_definitions",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "dataset.definition.remove",
      "command_path": "dataset definition remove",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes one definition by the id dataset definition list returns; use it when the user asks to drop or forget what a term means for this dataset. Everyone's chats on the dataset stop using it.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDefinitionRemoveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/definitions/{definition_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RemoveDatasetDefinition",
      "pagination_policy": "none",
      "preconditions": "Removes one definition by the id dataset definition list returns; use it when the user asks to drop or forget what a term means for this dataset. Everyone's chats on the dataset stop using it.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetDefinitionRemoveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.remove_definition",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.delete",
      "command_path": "dataset delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable dataset-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDataset",
      "pagination_policy": "none",
      "preconditions": "Immutable dataset-ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "dataset.download",
      "command_path": "dataset download",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: resource_ids (dataset, view and folder ids, in file order) and name (the file name without extension) are required; file_type is csv (a zip of CSVs when there are several) or xlsx (one workbook, a sheet per dataset); stack, numbered, views ({dataset id: view id}), output_path and timeout are optional. An existing output file is refused with file_exists unless --overwrite is given. Check the size first with dataset download-plan.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetDownloadResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Input: resource_ids (dataset, view and folder ids, in file order) and name (the file name without extension) are required; file_type is csv (a zip of CSVs when there are several) or xlsx (one workbook, a sheet per dataset); stack, numbered, views ({dataset id: view id}), output_path and timeout are optional. An existing output file is refused with file_exists unless --overwrite is given. Check the size first with dataset download-plan.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DatasetDownloadResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.download-plan",
      "command_path": "dataset download-plan",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reads headers only: how many datasets a download holds and how many files it is with same-column datasets stacked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetDownloadPlanResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Reads headers only: how many datasets a download holds and how many files it is with same-column datasets stacked.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetDownloadPlanResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.file-settings.get",
      "command_path": "dataset file-settings get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFileSettingsGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetFileSettings",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetFileSettingsGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get_file_settings",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.file-settings.undo",
      "command_path": "dataset file-settings undo",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetFileSettingsUndoResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "UndoFileSettings",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetFileSettingsUndoResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.file_settings_undo",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "dataset.file-settings.update",
      "command_path": "dataset file-settings update",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetFileSettingsUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/file_settings",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateFileSettings",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetFileSettingsUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.file_settings_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.find",
      "command_path": "dataset find",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFindResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetFindResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.from-url.follow",
      "command_path": "dataset from-url follow",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Follow true keeps the dataset refreshing from its link; follow false makes it a copy.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetFromUrlFollowResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Follow true keeps the dataset refreshing from its link; follow false makes it a copy.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DatasetFromUrlFollowResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.from-url.links",
      "command_path": "dataset from-url links",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFromUrlLinksResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetFromUrlLinksResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.from-url.preview",
      "command_path": "dataset from-url preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reads the file at the link and keeps nothing; use it before creating a dataset from a URL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetFromUrlPreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Reads the file at the link and keeps nothing; use it before creating a dataset from a URL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetFromUrlPreviewResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.get",
      "command_path": "dataset get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDataset",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.interpretation.confirm",
      "command_path": "dataset interpretation confirm",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Finalizes a dataset whose file has more than one plausible reading (status has_unstructured_data): applies the interpretation to the whole file and creates the table. Run interpretation preview first and pass the same input here, or the structure_map it returned. The suggestions stored on the dataset are under additional_info.interpretation.instruction_suggestions in dataset get. Pass mode \"original\" (alone: it takes no reshape field) to keep the file in the layout it was uploaded in; later files for the dataset are then ingested the same way, without review. The result state shows the dataset afterwards. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetInterpretationConfirmResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/interpretation",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ConfirmDatasetInterpretation",
      "pagination_policy": "none",
      "preconditions": "Finalizes a dataset whose file has more than one plausible reading (status has_unstructured_data): applies the interpretation to the whole file and creates the table. Run interpretation preview first and pass the same input here, or the structure_map it returned. The suggestions stored on the dataset are under additional_info.interpretation.instruction_suggestions in dataset get. Pass mode \"original\" (alone: it takes no reshape field) to keep the file in the layout it was uploaded in; later files for the dataset are then ingested the same way, without review. The result state shows the dataset afterwards. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetInterpretationConfirmResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.interpretation_confirm",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.interpretation.preview",
      "command_path": "dataset interpretation preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Shows the rows the dataset would have under an interpretation, without finalizing it: preview_rows (header plus up to 50 rows), total_row_count, structure_map and header_types. --input needs user_instruction (plain English; the suggestions stored on the dataset are in dataset get under additional_info.interpretation.instruction_suggestions), a structure_map from an earlier preview, or destination_dataset_id. Nothing is applied to the file until interpretation confirm. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetInterpretationPreviewResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/interpretation/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PreviewDatasetInterpretation",
      "pagination_policy": "none",
      "preconditions": "Shows the rows the dataset would have under an interpretation, without finalizing it: preview_rows (header plus up to 50 rows), total_row_count, structure_map and header_types. --input needs user_instruction (plain English; the suggestions stored on the dataset are in dataset get under additional_info.interpretation.instruction_suggestions), a structure_map from an earlier preview, or destination_dataset_id. Nothing is applied to the file until interpretation confirm. Example: --input '{\"user_instruction\": \"Skip preamble rows, row 5 is the header\"}'.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetInterpretationPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.interpretation_preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.list",
      "command_path": "dataset list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "B01. Newest first. Each item carries rows and cols, created and updated time (updated is left out when it equals created), the source kind (file, connector, created in Mammoth, export of a view), and its column names with types, from the list route's stored stats, sources and data_schema, cut to fit the agent tool output cap: more is true with next_offset when the page was cut. full true returns the raw id and name list. name (input field, a case-insensitive substring) reads every page and returns only the matching datasets as short rows (id, name, rows, cols; no column lists) with matched, and more with next_offset when cut; limit and offset then page over the matches. limit must be at most 100. names true returns up to 500 bare id and name rows of the project in ONE call, newest first, with total and more: use it for a list of names (which files can I see), never page offsets. Without a project use dataset find NAME_SUBSTRING.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetDatasets",
      "pagination_policy": "single_page",
      "preconditions": "B01. Newest first. Each item carries rows and cols, created and updated time (updated is left out when it equals created), the source kind (file, connector, created in Mammoth, export of a view), and its column names with types, from the list route's stored stats, sources and data_schema, cut to fit the agent tool output cap: more is true with next_offset when the page was cut. full true returns the raw id and name list. name (input field, a case-insensitive substring) reads every page and returns only the matching datasets as short rows (id, name, rows, cols; no column lists) with matched, and more with next_offset when cut; limit and offset then page over the matches. limit must be at most 100. names true returns up to 500 bare id and name rows of the project in ONE call, newest first, with total and more: use it for a list of names (which files can I see), never page offsets. Without a project use dataset find NAME_SUBSTRING.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "dataset.refresh",
      "command_path": "dataset refresh",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Fetches the link of a dataset made from a URL (dataset create with ds_creation_type weburl; dataset list shows it as source url with the link host) again into the same dataset, and waits for the job. Whether the new data replaces or adds to the old follows the dataset's own data addition setting. A dataset not made from a URL is refused, and so is a URL that serves JSON; the server's reason is shown. A single CSV only. It never refreshes on a schedule, and automation run_data_retrieval cannot refresh it; for a scheduled pull from a URL use the REST API connector.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetRefreshResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Fetches the link of a dataset made from a URL (dataset create with ds_creation_type weburl; dataset list shows it as source url with the link host) again into the same dataset, and waits for the job. Whether the new data replaces or adds to the old follows the dataset's own data addition setting. A dataset not made from a URL is refused, and so is a URL that serves JSON; the server's reason is shown. A single CSV only. It never refreshes on a schedule, and automation run_data_retrieval cannot refresh it; for a scheduled pull from a URL use the REST API connector.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DatasetRefreshResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.rename",
      "command_path": "dataset rename",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Convenience alias implemented through DatasetsAPI.update but registered as its own canonical command.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetRenameResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Convenience alias implemented through DatasetsAPI.update but registered as its own canonical command.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DatasetRenameResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.restore",
      "command_path": "dataset restore",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetRestoreResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RestoreDataset",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetRestoreResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.schema-diff",
      "command_path": "dataset schema-diff",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DESTINATION_ID, SOURCE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetSchemaDiffResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: DESTINATION_ID, SOURCE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetSchemaDiffResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.search",
      "command_path": "dataset search",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TERM.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetSearchResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/search",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SearchDatasetsByContent",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TERM.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetSearchResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.search",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "dataset.tool-claim.get",
      "command_path": "dataset tool-claim get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetToolClaimGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /tool-claims",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetToolClaim",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetToolClaimGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.tool_claim_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.tool-claim.redeem",
      "command_path": "dataset tool-claim redeem",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The link must have been emailed to the signed-in user. Redeeming it again adds nothing and returns where the tables already are.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetToolClaimRedeemResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/tool-claims",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RedeemToolClaim",
      "pagination_policy": "none",
      "preconditions": "The link must have been emailed to the signed-in user. Redeeming it again adds nothing and returns where the tables already are.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetToolClaimRedeemResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.tool_claim_redeem",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "dataset.trash",
      "command_path": "dataset trash",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetTrashResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TrashDataset",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetTrashResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.trash",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "dataset.update",
      "command_path": "dataset update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]: raw patch operations include rename/refresh/column changes/reattach/deletion; do not dispatch them. Use dataset.rename or dataset.file-settings.update for their typed variants. The pinned SDK has no public binding for the singular UpdateDataset route, so its other OpenAPI patch variants remain unavailable until a typed SDK contract exists.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "DatasetUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateDataset",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B07 DATASET_PATCH_UNTYPED]: raw patch operations include rename/refresh/column changes/reattach/deletion; do not dispatch them. Use dataset.rename or dataset.file-settings.update for their typed variants. The pinned SDK has no public binding for the singular UpdateDataset route, so its other OpenAPI patch variants remain unavailable until a typed SDK contract exists.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "DatasetUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.datasets.DatasetsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.update-method.get",
      "command_path": "dataset update-method get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "mode \"add\" means each new file (an upload with append_to_ds_id, or a folder automation) adds its rows to the dataset; \"replace\" means it takes the place of the rows already there. A dataset with no setting stored adds.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DatasetUpdateMethodGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "mode \"add\" means each new file (an upload with append_to_ds_id, or a folder automation) adds its rows to the dataset; \"replace\" means it takes the place of the rows already there. A dataset with no setting stored adds.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DatasetUpdateMethodGetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "dataset.update-method.set",
      "command_path": "dataset update-method set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "mode \"replace\" or \"add\". It stays on the dataset: every later upload into it (file upload with append_to_ds_id) and every folder automation feeding it follows it, until it is set again. Optional schema_mapping {\"dataset column\": [\"file column\"]} matches a new file's columns to the dataset's. The other settings for new rows are kept as stored.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "DatasetUpdateMethodSetResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "mode \"replace\" or \"add\". It stays on the dataset: every later upload into it (file upload with append_to_ds_id) and every folder automation feeding it follows it, until it is set again. Optional schema_mapping {\"dataset column\": [\"file column\"]} matches a new file's columns to the dataset's. The other settings for new rows are kept as stored.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "DatasetUpdateMethodSetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "doctor",
      "command_path": "doctor",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prints the report either way; exits 4 when the report's ok is false.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "DoctorResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Prints the report either way; exits 4 when the report's ok is false.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "DoctorResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "external-key.create",
      "command_path": "external-key create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "secure_key is a secret_fields entry: --input FILE, mode 0600 (shell) or the --input JSON's secure_key field (embedded), behind the confirmation card; never in a reply, note, checkpoint or run log. Response is recursively redacted.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExternalKeyCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/external_keys",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddExternalKey",
      "pagination_policy": "none",
      "preconditions": "secure_key is a secret_fields entry: --input FILE, mode 0600 (shell) or the --input JSON's secure_key field (embedded), behind the confirmation card; never in a reply, note, checkpoint or run log. Response is recursively redacted.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ExternalKeyCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "external-key.delete",
      "command_path": "external-key delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ExternalKeyDeleteResult",
        "scope": "workspace",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/external_keys/{key_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteExternalKey",
      "pagination_policy": "none",
      "preconditions": "Immutable ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ExternalKeyDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "external-key.get",
      "command_path": "external-key get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: KEY_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ExternalKeyGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/external_keys/{key_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetExternalKey",
      "pagination_policy": "none",
      "preconditions": "Required inputs: KEY_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ExternalKeyGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "external-key.list",
      "command_path": "external-key list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ExternalKeyListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/external_keys",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetKeysByWorkspaceId",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ExternalKeyListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.external_keys.ExternalKeysAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "file.bulk-delete",
      "command_path": "file bulk-delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes every listed uploaded file for good and cannot be undone. List them first (`file list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/files",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteFiles",
      "pagination_policy": "none",
      "preconditions": "Deletes every listed uploaded file for good and cannot be undone. List them first (`file list`). Needs a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.bulk_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "file.delete",
      "command_path": "file delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Canonical file delete FILE_ID... accepts one or more IDs; resolve every ID before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteFile",
      "pagination_policy": "none",
      "preconditions": "Canonical file delete FILE_ID... accepts one or more IDs; resolve every ID before confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "file.extract-sheets",
      "command_path": "file extract-sheets",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires unique nonempty sheet names. Live upload permission is currently blocked.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileExtractSheetsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Requires unique nonempty sheet names. Live upload permission is currently blocked.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "FileExtractSheetsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "file.get",
      "command_path": "file get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FILE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FileGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetFileDetails",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FILE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FileGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "file.list",
      "command_path": "file list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FileListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/files",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "ListFiles",
      "pagination_policy": "offset",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FileListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "file.multi-sheet-extract",
      "command_path": "file multi-sheet-extract",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {tables: [{sheet_name, dataset_name, structure_map, block_id?, combine_group_id?, source_label?, sheet_block_count?}] (1 to 100 accepted reads from file multi-sheet-preview), delete_file_after_extract?}. The file is deleted after extraction unless delete_file_after_extract is false.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileMultiSheetExtractResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}/multi-sheet-extraction",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateDatasetsFromMultiSheetFile",
      "pagination_policy": "none",
      "preconditions": "Input: {tables: [{sheet_name, dataset_name, structure_map, block_id?, combine_group_id?, source_label?, sheet_block_count?}] (1 to 100 accepted reads from file multi-sheet-preview), delete_file_after_extract?}. The file is deleted after extraction unless delete_file_after_extract is false.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileMultiSheetExtractResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.create_datasets_from_multi_sheet",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "file.multi-sheet-preview",
      "command_path": "file multi-sheet-preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {sheet_name (required), block_id?, user_instruction?, structure_map?}. Shows how one sheet reads before any dataset exists; nothing is saved.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileMultiSheetPreviewResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}/sheets/interpretation/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PreviewMultiSheetInterpretation",
      "pagination_policy": "none",
      "preconditions": "Input: {sheet_name (required), block_id?, user_instruction?, structure_map?}. Shows how one sheet reads before any dataset exists; nothing is saved.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileMultiSheetPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.preview_multi_sheet",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "file.set-password",
      "command_path": "file set-password",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Unlocks a password-protected file: ask the user for the file's password and pass it in --input; never ask for an unlocked copy. The password is secret and never a normal flag.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileSetPasswordResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Unlocks a password-protected file: ask the user for the file's password and pass it in --input; never ask for an unlocked copy. The password is secret and never a normal flag.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "FileSetPasswordResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "file.update",
      "command_path": "file update",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Existing method waits but returns the pre-wait response; must return stable final state. Path extract_pdf_tables takes a typed value (filename, extraction_method tables_only, all_content or custom, optional user_instruction with instruction and instruction_type, preview_page, extract_full_document, delete_file_after_extract) - the extraction setting a dataset's saved recipe replays for PDFs an automation receives.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/files/{file_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateFileConfigs",
      "pagination_policy": "none",
      "preconditions": "Existing method waits but returns the pre-wait response; must return stable final state. Path extract_pdf_tables takes a typed value (filename, extraction_method tables_only, all_content or custom, optional user_instruction with instruction and instruction_type, preview_page, extract_full_document, delete_file_after_extract) - the extraction setting a dataset's saved recipe replays for PDFs an automation receives.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "start_or_wait",
      "canonical_command": "file.upload",
      "command_path": "file upload",
      "confirmation": "none",
      "contract": {
        "async": "start_or_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Accepted extensions: csv tsv psv txt xls xlsx xml pdf tiff jpeg jpg png heic webp and archives zip gz bz2 tar 7z (not json). Request size is capped by the ingress in front of the API: a 60 MB upload is refused with HTTP 413 (invalid_argument) before the API sees it; 16 MB is accepted (measured on release 2026-09-19; the cap between them is not pinned down). Keep one upload well under 16 MB: split larger files or upload a zip/gz. Parsing is asynchronous; use --timeout 300 for files past a few MB and poll the returned job on timeout. Upload authorization is tenant- and scope-specific; a permission failure does not make this route universally unavailable. On success retain returned IDs, read them back, and verify owned cleanup; do not assume other upload variants are qualified. Each sheet of an Excel file becomes its own dataset. The input field mode (replace or add) sets the update method of the dataset the file is appended to: it needs append_to_ds_id and cannot be combined with wait_for_completion false (both are usage errors). An upload into a dataset whose columns do not match is not appended: the command fails with code schema_mismatch, rows_added 0 and kept_dataset_ids (the file's own dataset stays in the project as a separate dataset; delete it or fix the file and upload again). The input field override_target_schema (make the file's columns the dataset's) is honoured by the server only when the dataset's update method is replace, which deletes the rows it holds: the CLI refuses it under any other method before sending the file, and without append_to_ds_id or with wait_for_completion false.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FileUploadResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/files",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateFileDataset",
      "pagination_policy": "none",
      "preconditions": "Accepted extensions: csv tsv psv txt xls xlsx xml pdf tiff jpeg jpg png heic webp and archives zip gz bz2 tar 7z (not json). Request size is capped by the ingress in front of the API: a 60 MB upload is refused with HTTP 413 (invalid_argument) before the API sees it; 16 MB is accepted (measured on release 2026-09-19; the cap between them is not pinned down). Keep one upload well under 16 MB: split larger files or upload a zip/gz. Parsing is asynchronous; use --timeout 300 for files past a few MB and poll the returned job on timeout. Upload authorization is tenant- and scope-specific; a permission failure does not make this route universally unavailable. On success retain returned IDs, read them back, and verify owned cleanup; do not assume other upload variants are qualified. Each sheet of an Excel file becomes its own dataset. The input field mode (replace or add) sets the update method of the dataset the file is appended to: it needs append_to_ds_id and cannot be combined with wait_for_completion false (both are usage errors). An upload into a dataset whose columns do not match is not appended: the command fails with code schema_mismatch, rows_added 0 and kept_dataset_ids (the file's own dataset stays in the project as a separate dataset; delete it or fix the file and upload again). The input field override_target_schema (make the file's columns the dataset's) is honoured by the server only when the dataset's update method is replace, which deletes the rows it holds: the CLI refuses it under any other method before sending the file, and without append_to_ds_id or with wait_for_completion false.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FileUploadResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.files.FilesAPI.upload",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "start_or_wait",
      "canonical_command": "file.upload-folder",
      "command_path": "file upload-folder",
      "confirmation": "none",
      "contract": {
        "async": "start_or_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Nonrecursive; rejects an empty folder. Live upload permission is currently blocked.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "FileUploadFolderResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Nonrecursive; rejects an empty folder. Live upload permission is currently blocked.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "FileUploadFolderResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "folder.bulk-delete",
      "command_path": "folder bulk-delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes every listed folder for good and cannot be undone. List them first (`folder list`). Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/folders",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteFolders",
      "pagination_policy": "none",
      "preconditions": "Deletes every listed folder for good and cannot be undone. List them first (`folder list`). Needs a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.bulk_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "folder.create",
      "command_path": "folder create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/folders",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateFolder",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "folder.delete",
      "command_path": "folder delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sorted ID-set confirmation, plus exact project ID and phrase DELETE FOLDER CONTENTS when removing contents.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteFolder",
      "pagination_policy": "none",
      "preconditions": "Sorted ID-set confirmation, plus exact project ID and phrase DELETE FOLDER CONTENTS when removing contents.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "folder.find",
      "command_path": "folder find",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: NAME_SUBSTRING.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderFindResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: NAME_SUBSTRING.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FolderFindResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "folder.get",
      "command_path": "folder get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetFolder",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FOLDER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FolderGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "folder.list",
      "command_path": "folder list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/folders",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "ListFolders",
      "pagination_policy": "offset",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FolderListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "returns_job",
      "canonical_command": "folder.move",
      "command_path": "folder move",
      "confirmation": "none",
      "contract": {
        "async": "returns_job",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prefer dataset_ids/view_ids (the plain ids dataset get/view get return) over resource_ids -- the SDK resolves them to resource ids for you. resource_ids itself takes each item's resource id, not a dataset/view's own id. target_folder_resource_id is the destination folder's id, exactly as folder list/folder get/folder create return it (the id the web app opens the folder by).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderMoveResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/folders",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateFolderResources",
      "pagination_policy": "none",
      "preconditions": "Prefer dataset_ids/view_ids (the plain ids dataset get/view get return) over resource_ids -- the SDK resolves them to resource ids for you. resource_ids itself takes each item's resource id, not a dataset/view's own id. target_folder_resource_id is the destination folder's id, exactly as folder list/folder get/folder create return it (the id the web app opens the folder by).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderMoveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.move",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "folder.root",
      "command_path": "folder root",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "FolderRootResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "FolderRootResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "folder.trash",
      "command_path": "folder trash",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderTrashResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TrashFolder",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FOLDER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderTrashResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.trash",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "folder.update",
      "command_path": "folder update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FOLDER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "FolderUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/folders/{folder_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateFolderDetails",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FOLDER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "FolderUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.folders.FoldersAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "history.list",
      "command_path": "history list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists writes made from this machine only. Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HistoryListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Lists writes made from this machine only. Not available embedded.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "HistoryListResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "history.resume",
      "command_path": "history resume",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Resumes a mammoth run or recipe run started on this machine with the journal on. A named result larger than 256 KB is not kept, so a later line that reads it fails. Refuses when a write's outcome is unknown until from_line names where to start. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "HistoryResumeResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Resumes a mammoth run or recipe run started on this machine with the journal on. A named result larger than 256 KB is not kept, so a later line that reads it fails. Refuses when a write's outcome is unknown until from_line names where to start. Not available embedded.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "HistoryResumeResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "history.show",
      "command_path": "history show",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HistoryShowResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Not available embedded.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "HistoryShowResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "history.undo",
      "command_path": "history undo",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Undoes pipeline edits (back to the version before), objects a write created (to the trash) and moves to the trash (restored). Permanent deletes and external effects (exports, sends) cannot be undone and are reported. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "HistoryUndoResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Undoes pipeline edits (back to the version before), objects a write created (to the trash) and moves to the trash (restored). Permanent deletes and external effects (exports, sends) cannot be undone and are reported. Not available embedded.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "HistoryUndoResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "how",
      "command_path": "how",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: GOAL.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "HowResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: GOAL.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "HowResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "job.get",
      "command_path": "job get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "timeout parameter on current get_job is unused and stays visible only for public compatibility.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /jobs/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetJob",
      "pagination_policy": "none",
      "preconditions": "timeout parameter on current get_job is unused and stays visible only for public compatibility.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "JobGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.jobs.JobsAPI.get_job",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "job.get-many",
      "command_path": "job get-many",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "CLI accepts repeatable positive integers, not comma strings.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobGetManyResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /jobs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetJobs",
      "pagination_policy": "none",
      "preconditions": "CLI accepts repeatable positive integers, not comma strings.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "JobGetManyResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.jobs.JobsAPI.get_jobs",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "job.wait",
      "command_path": "job wait",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "On success, outcome is the state of what the job acted on: a view run gives the view (rows, cols, columns, status, pipeline_running) from one read, a project copy gives datasets, views, skipped and runs (ok, failed with each error, pending) from the job itself. No view get or view analyze is needed after it. A view that cannot be read is outcome_error, not a failed wait.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobWaitResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "On success, outcome is the state of what the job acted on: a view run gives the view (rows, cols, columns, status, pipeline_running) from one read, a project copy gives datasets, views, skipped and runs (ok, failed with each error, pending) from the job itself. No view get or view analyze is needed after it. A view that cannot be read is outcome_error, not a failed wait.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "JobWaitResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "job.wait-many",
      "command_path": "job wait-many",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reject empty IDs; do not succeed when the server omits a requested job.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "JobWaitManyResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Reject empty IDs; do not succeed when the server omits a requested job.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "JobWaitManyResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "link",
      "command_path": "link",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Folder and selected ids in a link are web app resource ids, not dataset or view ids; only /datasets/ID and /views/ID links carry those directly.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LinkResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Folder and selected ids in a link are web app resource ids, not dataset or view ids; only /datasets/ID and /views/ID links carry those directly.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "LinkResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "log.path",
      "command_path": "log path",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LogPathResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "LogPathResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "log.tail",
      "command_path": "log tail",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "LogTailResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "LogTailResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "notification.delete",
      "command_path": "notification delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: NOTIFICATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /notifications/{notification_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteNotification",
      "pagination_policy": "none",
      "preconditions": "Required inputs: NOTIFICATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "NotificationDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "notification.delete-batch",
      "command_path": "notification delete-batch",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes the matching notifications for good. List them first (`notification list`) with the same filters. Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationDeleteBatchResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /notifications",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteNotifications",
      "pagination_policy": "none",
      "preconditions": "Deletes the matching notifications for good. List them first (`notification list`) with the same filters. Needs a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "NotificationDeleteBatchResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.delete_batch",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "notification.list",
      "command_path": "notification list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "NotificationListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /notifications",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetAllNotifications",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "NotificationListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "notification.update",
      "command_path": "notification update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: NOTIFICATION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationUpdateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /notifications/{notification_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditNotification",
      "pagination_policy": "none",
      "preconditions": "Required inputs: NOTIFICATION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "NotificationUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "notification.update-batch",
      "command_path": "notification update-batch",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "NotificationUpdateBatchResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /notifications",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditNotifications",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "NotificationUpdateBatchResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.notifications.NotificationsAPI.update_batch",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.create",
      "command_path": "parameter create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "param_type is NUMERIC, TEXT or DATE (uppercase; 4PARM008 otherwise).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterCreateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateParameter",
      "pagination_policy": "none",
      "preconditions": "param_type is NUMERIC, TEXT or DATE (uppercase; 4PARM008 otherwise).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterCreateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.delete",
      "command_path": "parameter delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/parameters/{parameter_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteParameter",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARAMETER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "parameter.dependencies",
      "command_path": "parameter dependencies",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterDependenciesResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/parameters/{parameter_id}/dependencies",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetParameterDependencies",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARAMETER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ParameterDependenciesResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.dependencies",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.duplicate",
      "command_path": "parameter duplicate",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterDuplicateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters/{parameter_id}/duplicate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DuplicateParameter",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARAMETER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterDuplicateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.duplicate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "parameter.get",
      "command_path": "parameter get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARAMETER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/parameters/{parameter_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetParameterDetail",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARAMETER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ParameterGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.group.create",
      "command_path": "parameter group create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupCreateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters/groups",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateGroup",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterGroupCreateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.group.delete",
      "command_path": "parameter group delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: GROUP_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/parameters/groups/{group_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteGroup",
      "pagination_policy": "none",
      "preconditions": "Required inputs: GROUP_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterGroupDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "parameter.group.list",
      "command_path": "parameter group list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterGroupListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/parameters/groups",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListGroups",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ParameterGroupListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.group.reorder",
      "command_path": "parameter group reorder",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupReorderResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters/groups/reorder",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ReorderGroups",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterGroupReorderResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_reorder",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.group.update",
      "command_path": "parameter group update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: GROUP_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterGroupUpdateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/parameters/groups/{group_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateGroup",
      "pagination_policy": "none",
      "preconditions": "Required inputs: GROUP_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterGroupUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.group_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "parameter.list",
      "command_path": "parameter list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ParameterListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/parameters",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListParameters",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ParameterListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.rerun",
      "command_path": "parameter rerun",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterRerunResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters/{parameter_id}/rerun",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RerunParameter",
      "pagination_policy": "none",
      "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterRerunResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.rerun",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.rerun-all-stale",
      "command_path": "parameter rerun-all-stale",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterRerunAllStaleResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/parameters/rerun-all-stale",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RerunAllStale",
      "pagination_policy": "none",
      "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterRerunAllStaleResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.rerun_all_stale",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "parameter.update",
      "command_path": "parameter update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ParameterUpdateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/parameters/{parameter_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateParameter",
      "pagination_policy": "none",
      "preconditions": "A filter bound to a parameter can stay pending after the call returns; check verify.outcome and run `mammoth view pipeline wait VIEW_ID` before reading the view.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ParameterUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.parameters.ParametersAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.bulk-delete",
      "command_path": "project bulk-delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sorted comma-separated ID-set confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteProjects",
      "pagination_policy": "none",
      "preconditions": "Sorted comma-separated ID-set confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.bulk_delete_and_verify",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "project.bulk-update",
      "command_path": "project bulk-update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Release contract is ProjectsPatch (role add/replace/remove across projects). The CLI requires every patches[].value item to name a project_id and the confirmation names those ids; a body that names no project is refused before dispatch. Not verified live.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectBulkUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/projects",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateProjects",
      "pagination_policy": "none",
      "preconditions": "Release contract is ProjectsPatch (role add/replace/remove across projects). The CLI requires every patches[].value item to name a project_id and the confirmation names those ids; a body that names no project is refused before dispatch. Not verified live.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectBulkUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.bulk_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.check",
      "command_path": "project check",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reads the first view of each dataset (the one uploads and the playbooks use) and one data page per view, six resources at a time. `resources` has one status row per dataset and dashboard with its freshness (in_sync, out_of_sync or running, with data_updated_at) kept apart from its data quality (warning count), or the error that stopped its check. Given DATASET_ID it reads only that dataset's first view and skips the dashboards; also given VIEW_ID it reads that view instead. Every status row names the view_id and view_name it checked, so compare it with the view the work was on.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectCheckResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Reads the first view of each dataset (the one uploads and the playbooks use) and one data page per view, six resources at a time. `resources` has one status row per dataset and dashboard with its freshness (in_sync, out_of_sync or running, with data_updated_at) kept apart from its data quality (warning count), or the error that stopped its check. Given DATASET_ID it reads only that dataset's first view and skips the dashboards; also given VIEW_ID it reads that view instead. Every status row names the view_id and view_name it checked, so compare it with the view the work was on.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectCheckResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.checkpoint.list",
      "command_path": "project checkpoint list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectCheckpointListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/checkpoints",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetProjectCheckpoints",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectCheckpointListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.checkpoint_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "project.copy",
      "command_path": "project copy",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Creates a project: copies the datasets, views and pipelines of PROJECT_ID into a new project NAME, in one job the command waits for. Input fields: dataset_ids (copy only these; default all), include_dashboards (default false), exclude_data (default false, copies pipelines without rows). The result is project_id, dataset_map, view_map, skipped (what was left behind or still points outside the copy) and dashboards (dashboard_id, new_dashboard_id). Needs permission to create projects. Sweep with 'project delete ID --yes --confirm ID'.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectCopyResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/copy",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CopyProject",
      "pagination_policy": "none",
      "preconditions": "Creates a project: copies the datasets, views and pipelines of PROJECT_ID into a new project NAME, in one job the command waits for. Input fields: dataset_ids (copy only these; default all), include_dashboards (default false), exclude_data (default false, copies pipelines without rows). The result is project_id, dataset_map, view_map, skipped (what was left behind or still points outside the copy) and dashboards (dashboard_id, new_dashboard_id). Needs permission to create projects. Sweep with 'project delete ID --yes --confirm ID'.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectCopyResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.copy",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.create",
      "command_path": "project create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateProject",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.data-check.list",
      "command_path": "project data-check list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectDataCheckListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/data-checks",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetProjectDataChecks",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectDataCheckListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.data_check_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.delete",
      "command_path": "project delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable project-ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteProject",
      "pagination_policy": "none",
      "preconditions": "Immutable project-ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.delete_and_verify",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.ensure",
      "command_path": "project ensure",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Matches the exact, case-sensitive name; several projects with the same name resolve to the lowest id and the rest are listed under 'duplicates'. Creating a project is a benign mutation; sweep with 'project delete ID --yes --confirm ID'.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectEnsureResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Matches the exact, case-sensitive name; several projects with the same name resolve to the lowest id and the rest are listed under 'duplicates'. Creating a project is a benign mutation; sweep with 'project delete ID --yes --confirm ID'.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ProjectEnsureResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.get",
      "command_path": "project get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Reads one project by id. A token limited to one project can read only that project.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "single_page",
      "preconditions": "Reads one project by id. A token limited to one project can read only that project.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectGetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.list",
      "command_path": "project list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "B01 FIRST_PAGE_ONLY: no offset/cursor continuation proven yet.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetProject",
      "pagination_policy": "single_page",
      "preconditions": "B01 FIRST_PAGE_ONLY: no offset/cursor continuation proven yet.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.memory.add",
      "command_path": "project memory add",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Save only a preference the user stated for how the agent works or shows things (at most 20, each at most 200 characters); never data, results or secrets. The in-app agent applies them in every later turn in this project. A rule about what a board's data means (for example, Returned orders are refunds) belongs to that board: dashboard context create.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectMemoryAddResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Save only a preference the user stated for how the agent works or shows things (at most 20, each at most 200 characters); never data, results or secrets. The in-app agent applies them in every later turn in this project. A rule about what a board's data means (for example, Returned orders are refunds) belongs to that board: dashboard context create.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ProjectMemoryAddResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.memory.list",
      "command_path": "project memory list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The saved preferences are the caller's own, per project, oldest first; the in-app agent reads them at the start of every turn. Remove one by its zero-based position in this list.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectMemoryListResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "The saved preferences are the caller's own, per project, oldest first; the in-app agent reads them at the start of every turn. Remove one by its zero-based position in this list.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectMemoryListResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.memory.remove",
      "command_path": "project memory remove",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "index is the zero-based position from project memory list; use it when the user asks to forget a preference.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ProjectMemoryRemoveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "index is the zero-based position from project memory list; use it when the user asks to forget a preference.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ProjectMemoryRemoveResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "project.needs-attention",
      "command_path": "project needs-attention",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The rows of the Monitor Needs Attention tab for one project (the app has no workspace-wide list): pipeline_error, pending_pipeline, pending_data, checkpoint (needs approval), data_check (failed), each with view_id and the owning dataset_id, and needs_input (a file or dataset waiting for a person; action is unstructured_rows, ambiguous_date_format, password_required, sheet_selection_required or schema_mismatch); datasets lists each affected dataset once with its view_ids. Pending retentions are not returned by the API and are not included. To delete the datasets behind the views, take dataset_id from datasets and run dataset delete or dataset bulk-delete (confirm first).",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectNeedsAttentionResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "The rows of the Monitor Needs Attention tab for one project (the app has no workspace-wide list): pipeline_error, pending_pipeline, pending_data, checkpoint (needs approval), data_check (failed), each with view_id and the owning dataset_id, and needs_input (a file or dataset waiting for a person; action is unstructured_rows, ambiguous_date_format, password_required, sheet_selection_required or schema_mismatch); datasets lists each affected dataset once with its view_ids. Pending retentions are not returned by the API and are not included. To delete the datasets behind the views, take dataset_id from datasets and run dataset delete or dataset bulk-delete (confirm first).",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectNeedsAttentionResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.pending-changes",
      "command_path": "project pending-changes",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectPendingChangesResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/pending-changes",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPendingChanges",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectPendingChangesResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.pending_changes",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.publish-credentials",
      "command_path": "project publish-credentials",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectPublishCredentialsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/credentials",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPublishCredentials",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectPublishCredentialsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.publish_credentials",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.resource-dependencies",
      "command_path": "project resource-dependencies",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectResourceDependenciesResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resource-dependencies",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetResourceDependencies",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectResourceDependenciesResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_dependencies",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "always_wait",
      "canonical_command": "project.resource-dependencies.update",
      "command_path": "project resource-dependencies update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "always_wait",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes the resources the project declares it depends on; views and dashboards that read through a removed dependency can stop resolving data. Read the current set first (`project resource-dependencies`). Needs --yes and --confirm PROJECT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectResourceDependenciesUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/resource-dependencies",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "BulkModify",
      "pagination_policy": "none",
      "preconditions": "Changes the resources the project declares it depends on; views and dashboards that read through a removed dependency can stop resolving data. Read the current set first (`project resource-dependencies`). Needs --yes and --confirm PROJECT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectResourceDependenciesUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_dependencies_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "project.resource-status",
      "command_path": "project resource-status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ProjectResourceStatusResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/resource-status",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetResourceStatus",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ProjectResourceStatusResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.resource_status",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.sample-flow",
      "command_path": "project sample-flow",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectSampleFlowResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/sample-flow",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateSampleFlow",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectSampleFlowResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.sample_flow",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.update",
      "command_path": "project update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateProject",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "project.user.add",
      "command_path": "project user add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED. role is required, and a user who is already a project member is refused (the backend would replace that member's role, demoting an admin); change roles with project user update. Takes existing workspace users' ids. To add someone by email who is not in the workspace yet, use workspace user add with {\"email_ids\": [EMAIL], \"projects\": [{\"project_id\": PROJECT_ID, \"role\": ROLE}]}: it invites them as a workspace member with that project role, which is how a project gets a new person.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserAddResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddUserProject",
      "pagination_policy": "none",
      "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED. role is required, and a user who is already a project member is refused (the backend would replace that member's role, demoting an admin); change roles with project user update. Takes existing workspace users' ids. To add someone by email who is not in the workspace yet, use workspace user add with {\"email_ids\": [EMAIL], \"projects\": [{\"project_id\": PROJECT_ID, \"role\": ROLE}]}: it invites them as a workspace member with that project role, which is how a project gets a new person.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectUserAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.add_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "project.user.remove",
      "command_path": "project user remove",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED; sorted target-set confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserRemoveResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RemoveUserProject",
      "pagination_policy": "none",
      "preconditions": "B03 PROJECT_USER_ID_ROLE_UNTYPED; sorted target-set confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectUserRemoveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.remove_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "project.user.update",
      "command_path": "project user update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes one project member's role (role plus exactly one of user_id or invite_id); the person gains or loses access at once. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ProjectUserUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateUserProject",
      "pagination_policy": "none",
      "preconditions": "Changes one project member's role (role plus exactly one of user_id or invite_id); the person gains or loses access at once. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ProjectUserUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.projects.ProjectsAPI.user_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "recipe.list",
      "command_path": "recipe list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "RecipeListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "RecipeListResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "recipe.run",
      "command_path": "recipe run",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Runs only the recipes 'recipe list' shows. Stops at the first failed step; 'mammoth history undo' with the run's group reverses the writes. Not available embedded.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "RecipeRunResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Runs only the recipes 'recipe list' shows. Stops at the first failed step; 'mammoth history undo' with the run's group reverses the writes. Not available embedded.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "RecipeRunResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "report.list",
      "command_path": "report list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ReportListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /reports",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetReports",
      "pagination_policy": "offset",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ReportListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.reports.ReportsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "resolve",
      "command_path": "resolve",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: NAME.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ResolveResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: NAME.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ResolveResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "run",
      "command_path": "run",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "run has no global --yes or --confirm; a mutating line carries its own in flags. Not available embedded.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "RunResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "run has no global --yes or --confirm; a mutating line carries its own in flags. Not available embedded.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "RunResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "schedule.create",
      "command_path": "schedule create",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[SCHEDULE_CREATE_NOT_IMPLEMENTED]: the backend answers 5GENR011 NOT_IMPLEMENTED; the command fails with feature_unavailable and makes no API call. Use `mammoth automation create` instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleCreateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/schedules",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "CreateSchedule",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[SCHEDULE_CREATE_NOT_IMPLEMENTED]: the backend answers 5GENR011 NOT_IMPLEMENTED; the command fails with feature_unavailable and makes no API call. Use `mammoth automation create` instead.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ScheduleCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": true,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "schedule.delete",
      "command_path": "schedule delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteSchedule",
      "pagination_policy": "none",
      "preconditions": "Immutable ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ScheduleDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "schedule.get",
      "command_path": "schedule get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SCHEDULE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ScheduleGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSchedule",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SCHEDULE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ScheduleGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "schedule.list",
      "command_path": "schedule list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Retired: the command answers not_available and names the web app. No Mammoth server can list schedules for a project (GET answers HTTP 400 NOT_IMPLEMENTED), so do not poll it. Use `schedule get SCHEDULE_ID` with an id obtained elsewhere.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ScheduleListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/schedules",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "ListSchedules",
      "pagination_policy": "offset",
      "preconditions": "Retired: the command answers not_available and names the web app. No Mammoth server can list schedules for a project (GET answers HTTP 400 NOT_IMPLEMENTED), so do not poll it. Use `schedule get SCHEDULE_ID` with an id obtained elsewhere.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ScheduleListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "schedule.update",
      "command_path": "schedule update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "status=resume requires exact ID confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ScheduleUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/schedules/{schedule_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "PatchSchedule",
      "pagination_policy": "none",
      "preconditions": "status=resume requires exact ID confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ScheduleUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.schedules.SchedulesAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "schema.find",
      "command_path": "schema find",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: QUERY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaFindResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: QUERY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SchemaFindResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "schema.get",
      "command_path": "schema get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: COMMAND_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaGetResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: COMMAND_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SchemaGetResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "schema.list",
      "command_path": "schema list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SchemaListResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SchemaListResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.agents-md.install",
      "command_path": "skill agents-md install",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes one <mammoth-cli>…</mammoth-cli> block into AGENTS.md in the current directory (--input '{\"path\": \"CLAUDE.md\"}' for another file); re-running replaces the block in place. Local file write only.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillAgentsMdInstallResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Writes one <mammoth-cli>…</mammoth-cli> block into AGENTS.md in the current directory (--input '{\"path\": \"CLAUDE.md\"}' for another file); re-running replaces the block in place. Local file write only.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "SkillAgentsMdInstallResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.install",
      "command_path": "skill install",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillInstallResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "SkillInstallResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.list",
      "command_path": "skill list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillListResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SkillListResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.path",
      "command_path": "skill path",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillPathResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SkillPathResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.show",
      "command_path": "skill show",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prints the bundled SKILL.md under data.text; --input '{\"file\": \"references/recipes/transforms.md\"}' prints one reference file. Read-only, local.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SkillShowResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Prints the bundled SKILL.md under data.text; --input '{\"file\": \"references/recipes/transforms.md\"}' prints one reference file. Read-only, local.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SkillShowResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.uninstall",
      "command_path": "skill uninstall",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillUninstallResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "SkillUninstallResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "skill.update",
      "command_path": "skill update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "SkillUpdateResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "SkillUpdateResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "snippet.create",
      "command_path": "snippet create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/snippets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateSnippet",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SnippetCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "snippet.delete",
      "command_path": "snippet delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/snippets/{snippet_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteSnippet",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SnippetDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "snippet.dependencies",
      "command_path": "snippet dependencies",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetDependenciesResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/snippets/{snippet_id}/dependencies",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSnippetDependencies",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SnippetDependenciesResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.dependencies",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "snippet.duplicate",
      "command_path": "snippet duplicate",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetDuplicateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/snippets/{snippet_id}/duplicate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DuplicateSnippet",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SnippetDuplicateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.duplicate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "snippet.get",
      "command_path": "snippet get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/snippets/{snippet_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSnippetDetail",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SnippetGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "snippet.list",
      "command_path": "snippet list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SnippetListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/snippets",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSnippets",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SnippetListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "snippet.rerun",
      "command_path": "snippet rerun",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetRerunResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/snippets/{snippet_id}/rerun",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RerunSnippet",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SnippetRerunResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.rerun",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "snippet.update",
      "command_path": "snippet update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: SNIPPET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SnippetUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/snippets/{snippet_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateSnippet",
      "pagination_policy": "none",
      "preconditions": "Required inputs: SNIPPET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SnippetUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.snippets.SnippetsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.cancel-subscription",
      "command_path": "support billing cancel-subscription",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. `when` is required: now ends access and billing at once, period_end keeps the workspace until the paid period ends. Check `support workspace entitlement WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingCancelSubscriptionResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/billing/{workspace_id}/cancel-subscription",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportCancelSubscription",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. `when` is required: now ends access and billing at once, period_end keeps the workspace until the paid period ends. Check `support workspace entitlement WORKSPACE_ID` first.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingCancelSubscriptionResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_cancel_subscription",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.change-plan",
      "command_path": "support billing change-plan",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Look the plan up with `support plan catalog`; `when` is now or period_end. A change now is prorated and billed at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingChangePlanResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/billing/{workspace_id}/change-plan",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportChangePlan",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Look the plan up with `support plan catalog`; `when` is now or period_end. A change now is prorated and billed at once.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingChangePlanResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_change_plan",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.end-trial",
      "command_path": "support billing end-trial",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Ends the trial now and charges the plan; the card on file is billed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingEndTrialResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/billing/{workspace_id}/end-trial",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportEndTrial",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Ends the trial now and charges the plan; the card on file is billed.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingEndTrialResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_end_trial",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.refund",
      "command_path": "support billing refund",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Moves money back to the customer, and it cannot be undone. Exactly one of `amount` (positive whole cents, a partial refund) or `full: true` (the whole last payment) is required: neither, or both, is refused, so a refund is never full by omission. The confirmation text names the amount or FULL.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingRefundResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "POST /support/billing/{workspace_id}/refund",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "SupportRefund",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Moves money back to the customer, and it cannot be undone. Exactly one of `amount` (positive whole cents, a partial refund) or `full: true` (the whole last payment) is required: neither, or both, is refused, so a refund is never full by omission. The confirmation text names the amount or FULL.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingRefundResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_refund",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.retry-payment",
      "command_path": "support billing retry-payment",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Charges the failed invoice again; the card on file is billed.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingRetryPaymentResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/billing/{workspace_id}/retry-payment",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportRetryPayment",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. A workspace billed through a partner is refused: change it on the partner instead. Charges the failed invoice again; the card on file is billed.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingRetryPaymentResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_retry_payment",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.billing.start-trial",
      "command_path": "support billing start-trial",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Starts a trial of `days` (1-60) on the workspace. It REPLACES the workspace's billing and cancels a live paid Stripe subscription. Check `support workspace entitlement WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportBillingStartTrialResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/billing/{workspace_id}/start-trial",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportStartTrial",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Starts a trial of `days` (1-60) on the workspace. It REPLACES the workspace's billing and cancels a live paid Stripe subscription. Check `support workspace entitlement WORKSPACE_ID` first.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportBillingStartTrialResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.billing_start_trial",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector.bucket-impact",
      "command_path": "support connector bucket-impact",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorBucketImpactResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/connectors/{connector_id}/bucket-impact",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportConnectorBucketImpact",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportConnectorBucketImpactResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_bucket_impact",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector.create",
      "command_path": "support connector create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Adds a connector to the catalog for every workspace. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/connectors",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateConnector",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Adds a connector to the catalog for every workspace. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector.delete",
      "command_path": "support connector delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/connectors/{connector_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteConnector",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector.list",
      "command_path": "support connector list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/connectors",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSubscriptionConnectors",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportConnectorListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector.update",
      "command_path": "support connector update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/connectors/{connector_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateConnector",
      "pagination_policy": "none",
      "preconditions": "Required inputs: CONNECTOR_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector-profile.add-connector",
      "command_path": "support connector-profile add-connector",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID, CONNECTOR_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileAddConnectorResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/connector-profiles/{profile_id}/connectors",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddConnectorToProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID, CONNECTOR_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorProfileAddConnectorResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_add_connector",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector-profile.create",
      "command_path": "support connector-profile create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Creates a connector profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/connector-profiles",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateConnectorProfile",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Creates a connector profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorProfileCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector-profile.delete",
      "command_path": "support connector-profile delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/connector-profiles/{profile_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteConnectorProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorProfileDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector-profile.list",
      "command_path": "support connector-profile list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportConnectorProfileListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/connector-profiles",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListConnectorProfiles",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportConnectorProfileListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.connector-profile.update",
      "command_path": "support connector-profile update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportConnectorProfileUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/connector-profiles/{profile_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateConnectorProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportConnectorProfileUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.connector_profile_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.activity",
      "command_path": "support deal activity",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealActivityResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/deals/{deal_id}/activity",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportDealActivity",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DEAL_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportDealActivityResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_activity",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.cancel-move-to-partner",
      "command_path": "support deal cancel-move-to-partner",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the deal's pending move to a partner; read the deal first with `support deal get DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealCancelMoveToPartnerResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /support/deals/{deal_id}/move-to-partner",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportDealCancelMoveToPartner",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the deal's pending move to a partner; read the deal first with `support deal get DEAL_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportDealCancelMoveToPartnerResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_cancel_move_to_partner",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.create",
      "command_path": "support deal create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Needs `base_plan_id` and exactly one of the WORKSPACE_ID argument or `workspace_create`. A deal sets what the workspace is billed and entitled to.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/deals",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportCreateDeal",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Needs `base_plan_id` and exactly one of the WORKSPACE_ID argument or `workspace_create`. A deal sets what the workspace is billed and entitled to.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportDealCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.get",
      "command_path": "support deal get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/deals/{deal_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportGetDeal",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DEAL_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportDealGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.list",
      "command_path": "support deal list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/deals",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "SupportListDeals",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportDealListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.move-to-partner",
      "command_path": "support deal move-to-partner",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the deal's billing under a partner (`when`: period_end or now). With `when` now, the workspace's subscription is cancelled prorated and the unused time is refunded. Undo a pending move with `support deal cancel-move-to-partner DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealMoveToPartnerResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/deals/{deal_id}/move-to-partner",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportDealMoveToPartner",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the deal's billing under a partner (`when`: period_end or now). With `when` now, the workspace's subscription is cancelled prorated and the unused time is refunded. Undo a pending move with `support deal cancel-move-to-partner DEAL_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportDealMoveToPartnerResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_move_to_partner",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.opt-in",
      "command_path": "support deal opt-in",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Releases opt-in rollout pins on the deal (`keys`, `connectors`, or `everything`), which can change the workspace's entitlements at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealOptInResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/deals/{deal_id}/opt-in",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportDealOptIn",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Releases opt-in rollout pins on the deal (`keys`, `connectors`, or `everything`), which can change the workspace's entitlements at once.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportDealOptInResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_opt_in",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.preview-entitlement",
      "command_path": "support deal preview-entitlement",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DEAL_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportDealPreviewEntitlementResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/deals/{deal_id}/preview-entitlement",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportPreviewDealEntitlement",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DEAL_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportDealPreviewEntitlementResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_preview_entitlement",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.deal.update",
      "command_path": "support deal update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Changes what the workspace is billed and entitled to; a bad status turns entitlements off. Read the deal first with `support deal get DEAL_ID`, and preview the result with `support deal preview-entitlement DEAL_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportDealUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /support/deals/{deal_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportUpdateDeal",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Changes what the workspace is billed and entitled to; a bad status turns entitlements off. Read the deal first with `support deal get DEAL_ID`, and preview the result with `support deal preview-entitlement DEAL_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportDealUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.deal_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.entitlement.registry",
      "command_path": "support entitlement registry",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportEntitlementRegistryResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/entitlements",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportEntitlementRegistry",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportEntitlementRegistryResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.entitlement_registry",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature.create",
      "command_path": "support feature create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Adds a feature flag to the catalog for every workspace. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/features",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateFeature",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Adds a feature flag to the catalog for every workspace. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature.delete",
      "command_path": "support feature delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/features/{feature_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteFeature",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FEATURE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature.list",
      "command_path": "support feature list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportFeatureListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/features",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListFeatures",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportFeatureListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature.update",
      "command_path": "support feature update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/features/{feature_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateFeature",
      "pagination_policy": "none",
      "preconditions": "Required inputs: FEATURE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature-profile.add-feature",
      "command_path": "support feature-profile add-feature",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID, FEATURE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileAddFeatureResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/feature-profiles/{profile_id}/features",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddFeatureToProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID, FEATURE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureProfileAddFeatureResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_add_feature",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature-profile.create",
      "command_path": "support feature-profile create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Creates a feature profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/feature-profiles",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateFeatureProfile",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Creates a feature profile that workspaces can be assigned. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureProfileCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature-profile.delete",
      "command_path": "support feature-profile delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/feature-profiles/{profile_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteFeatureProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureProfileDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature-profile.list",
      "command_path": "support feature-profile list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportFeatureProfileListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/feature-profiles",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListFeatureProfiles",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportFeatureProfileListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.feature-profile.update",
      "command_path": "support feature-profile update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PROFILE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportFeatureProfileUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/feature-profiles/{profile_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateFeatureProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PROFILE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportFeatureProfileUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.feature_profile_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.identity.get",
      "command_path": "support identity get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportIdentityGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/identities/{user_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportGetIdentity",
      "pagination_policy": "none",
      "preconditions": "Required inputs: USER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportIdentityGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.identity_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.identity.list",
      "command_path": "support identity list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportIdentityListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/identities",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "SupportListIdentities",
      "pagination_policy": "offset",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportIdentityListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.identity_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.ownership.transfer",
      "command_path": "support ownership transfer",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportOwnershipTransferResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /settings/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "TransferOwnerships",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportOwnershipTransferResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.ownership_transfer",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.activity",
      "command_path": "support partner activity",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerActivityResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners/{partner_id}/activity",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportPartnerActivity",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARTNER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerActivityResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_activity",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.billing",
      "command_path": "support partner billing",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerBillingResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners/{partner_id}/billing",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportGetPartnerBilling",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARTNER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerBillingResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_billing",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.charge-invoices",
      "command_path": "support partner charge-invoices",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Charges every open invoice of the partner now; the partner's card on file is billed. Look at them first with `support partner invoices PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerChargeInvoicesResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/partners/{partner_id}/charge-invoices",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportChargePartnerInvoices",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Charges every open invoice of the partner now; the partner's card on file is billed. Look at them first with `support partner invoices PARTNER_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerChargeInvoicesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_charge_invoices",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.client.cancel-detach",
      "command_path": "support partner client cancel-detach",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the client's pending detach. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List the clients first with `support partner client list PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientCancelDetachResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /support/partners/{partner_id}/workspaces/{workspace_id}/detach",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportCancelDetachClient",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the client's pending detach. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List the clients first with `support partner client list PARTNER_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerClientCancelDetachResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_cancel_detach",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.client.delete",
      "command_path": "support partner client delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Deletes the client workspace of the partner, and it cannot be undone. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List them first with `support partner client list PARTNER_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /support/partners/{partner_id}/workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "SupportDeletePartnerClient",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Deletes the client workspace of the partner, and it cannot be undone. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. List them first with `support partner client list PARTNER_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerClientDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.client.detach",
      "command_path": "support partner client detach",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Turns the partner's client into a direct customer: `price` (above 0) and `contact_email` are required. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. Undo a pending detach with `support partner client cancel-detach PARTNER_ID WORKSPACE_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerClientDetachResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/partners/{partner_id}/workspaces/{workspace_id}/detach",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportDetachClient",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Turns the partner's client into a direct customer: `price` (above 0) and `contact_email` are required. Confirm with the WORKSPACE id (`--confirm WORKSPACE_ID`, the second argument), not the partner id. Undo a pending detach with `support partner client cancel-detach PARTNER_ID WORKSPACE_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerClientDetachResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_detach",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.client.list",
      "command_path": "support partner client list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerClientListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners/{partner_id}/workspaces",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "SupportListPartnerClients",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: PARTNER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerClientListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_client_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.create",
      "command_path": "support partner create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Creates a partner record; no money moves.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/partners",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportCreatePartner",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Creates a partner record; no money moves.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.get",
      "command_path": "support partner get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners/{partner_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportGetPartner",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARTNER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.invoices",
      "command_path": "support partner invoices",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PARTNER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerInvoicesResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners/{partner_id}/invoices",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportListPartnerInvoices",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PARTNER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerInvoicesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_invoices",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.list",
      "command_path": "support partner list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPartnerListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/partners",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "SupportListPartners",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPartnerListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.send-payment-link",
      "command_path": "support partner send-payment-link",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the partner contact a payment link; the email goes out at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerSendPaymentLinkResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/partners/{partner_id}/send-payment-link",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportSendPartnerPaymentLink",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the partner contact a payment link; the email goes out at once.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerSendPaymentLinkResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_send_payment_link",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.partner.update",
      "command_path": "support partner update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. An empty string clears contact_name, contact_email or notes. billing_method sets how the partner's consolidated subscription is collected.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPartnerUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /support/partners/{partner_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportUpdatePartner",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. An empty string clears contact_name, contact_email or notes. billing_method sets how the partner's consolidated subscription is collected.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPartnerUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.partner_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.archive",
      "command_path": "support plan archive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanArchiveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/plans/{plan_id}/archive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ArchivePlan",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanArchiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_archive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.catalog",
      "command_path": "support plan catalog",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanCatalogResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/plans/catalog",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportPlansCatalog",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanCatalogResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_catalog",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.chargebee-list",
      "command_path": "support plan chargebee-list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanChargebeeListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/sms",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPlans",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanChargebeeListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_chargebee_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.create",
      "command_path": "support plan create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Creates a billing plan that workspaces can subscribe to. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/plans",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreatePlan",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Creates a billing plan that workspaces can subscribe to. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.delete",
      "command_path": "support plan delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/plans/{plan_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeletePlan",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.get",
      "command_path": "support plan get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/plans/{plan_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPlan",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.list",
      "command_path": "support plan list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/plans",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSubscriptionPlans",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.self-serve-list",
      "command_path": "support plan self-serve-list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanSelfServeListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/self-serve-plans",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListSelfServePlans",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanSelfServeListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_self_serve_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.storage-option.archive",
      "command_path": "support plan storage-option archive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Retires the option so it can no longer be chosen; never deleted, subscriptions billed at that size keep it. Confirm with the option id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionArchiveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /subscription/plans/{plan_id}/storage-options/{option_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ArchiveStorageOption",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Retires the option so it can no longer be chosen; never deleted, subscriptions billed at that size keep it. Confirm with the option id.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanStorageOptionArchiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_archive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.storage-option.create",
      "command_path": "support plan storage-option create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Adds a purchasable storage size to an inline-pricing plan. storage_gb is the TOTAL allocation, not an increment; prices are the monthly and annual add on top of the plan price.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/plans/{plan_id}/storage-options",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateStorageOption",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Adds a purchasable storage size to an inline-pricing plan. storage_gb is the TOTAL allocation, not an increment; prices are the monthly and annual add on top of the plan price.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanStorageOptionCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.plan.storage-option.list",
      "command_path": "support plan storage-option list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every purchasable storage size of the plan, archived ones included.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportPlanStorageOptionListResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /subscription/plans/{plan_id}/storage-options",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListStorageOptions",
      "pagination_policy": "single_page",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every purchasable storage size of the plan, archived ones included.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportPlanStorageOptionListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.storage-option.update",
      "command_path": "support plan storage-option update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-prices or resizes one storage option; send at least one of storage_gb, monthly_price, annual_price. Confirm with the option id.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanStorageOptionUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/plans/{plan_id}/storage-options/{option_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateStorageOption",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-prices or resizes one storage option; send at least one of storage_gb, monthly_price, annual_price. Confirm with the option id.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanStorageOptionUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_storage_option_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.unarchive",
      "command_path": "support plan unarchive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Unarchives a plan archived with support plan archive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUnarchiveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /subscription/plans/{plan_id}/unarchive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UnarchivePlan",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Unarchives a plan archived with support plan archive.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanUnarchiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_unarchive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.update",
      "command_path": "support plan update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/plans/{plan_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdatePlan",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.update-entitlements",
      "command_path": "support plan update-entitlements",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes what every workspace on the plan is granted, at once. Legacy and system plans are read-only. Read `support plan get` first. Needs --yes and --confirm PLAN_ID (the refusal prints the exact target). --dry-run names the plan and the new values; the plan's current values are not readable from a mapped read, so compare with the plans matrix.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateEntitlementsResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/plans/{plan_id}/entitlements",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdatePlanEntitlements",
      "pagination_policy": "none",
      "preconditions": "Changes what every workspace on the plan is granted, at once. Legacy and system plans are read-only. Read `support plan get` first. Needs --yes and --confirm PLAN_ID (the refusal prints the exact target). --dry-run names the plan and the new values; the plan's current values are not readable from a mapped read, so compare with the plans matrix.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanUpdateEntitlementsResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update_entitlements",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.plan.update-storage-tiers",
      "command_path": "support plan update-storage-tiers",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportPlanUpdateStorageTiersResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /subscription/plans/{plan_id}/storage-tiers",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateStorageTiers",
      "pagination_policy": "none",
      "preconditions": "Required inputs: PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportPlanUpdateStorageTiersResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.plan_update_storage_tiers",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.project-move.get",
      "command_path": "support project-move get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Needs no workspace header. A move that is stalled (its worker died) resumes when `support workspace project move-start` runs again.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportProjectMoveGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/project-moves/{move_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetProjectMove",
      "pagination_policy": "none",
      "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Needs no workspace header. A move that is stalled (its worker died) resumes when `support workspace project move-start` runs again.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportProjectMoveGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.project-move.purge",
      "command_path": "support project-move purge",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Refused for a move that is not finished.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportProjectMovePurgeResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/project-moves/{move_id}/purge",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "PurgeProjectMove",
      "pagination_policy": "none",
      "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Refused for a move that is not finished.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportProjectMovePurgeResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_purge",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.search",
      "command_path": "support search",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportSearchResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/search",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportSearch",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportSearchResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.search",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.subscription.create",
      "command_path": "support subscription create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID, PLAN_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportSubscriptionCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/sms",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RegisterSubscription",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID, PLAN_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportSubscriptionCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.subscription.get",
      "command_path": "support subscription get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportSubscriptionGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/sms",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetSubscriptionDetail",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportSubscriptionGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.subscription.update",
      "command_path": "support subscription update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID, SUBSCRIPTION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportSubscriptionUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /support/workspaces/{workspace_id}/sms",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateSubscription",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID, SUBSCRIPTION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportSubscriptionUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.subscription_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.audit",
      "command_path": "support template audit",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-runs every curated-catalog gate: faults with remedies, checked, and curated entries never seeded (missing). Read-only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateAuditResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/audit",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminAudit",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Re-runs every curated-catalog gate: faults with remedies, checked, and curated entries never seeded (missing). Read-only.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateAuditResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_audit",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.canvas",
      "command_path": "support template canvas",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. The template's canvas with its baked plan and specs, drafts included.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateCanvasResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/{slug}/canvas",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminRowCanvas",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. The template's canvas with its baked plan and specs, drafts included.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateCanvasResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_canvas",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.data-preview",
      "command_path": "support template data-preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Up to 50 rows of the data the template opens on; capped says whether there are more.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateDataPreviewResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/{slug}/data-preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminDataPreview",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Up to 50 rows of the data the template opens on; capped says whether there are more.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateDataPreviewResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_data_preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.discard",
      "command_path": "support template discard",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Permanently removes a curated DRAFT, its preview board and its data (if no other template shares it). Refused for a live template: unpublish or retire it instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateDiscardResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /dashboards/v3/templates/admin/{slug}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DashboardV3AdminDiscardImport",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Permanently removes a curated DRAFT, its preview board and its data (if no other template shares it). Refused for a live template: unpublish or retire it instead.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateDiscardResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_discard",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.edit",
      "command_path": "support template edit",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Edits a curated template's filing: changes holds title, description, use_case, function, industry (list) or sort_order; null clears a field. Optional base_version makes it conditional (409 when the row moved). notes says what changes for customers.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateEditResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /dashboards/v3/templates/admin/{slug}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminEditRow",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Edits a curated template's filing: changes holds title, description, use_case, function, industry (list) or sort_order; null clears a field. Optional base_version makes it conditional (409 when the row moved). notes says what changes for customers.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateEditResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_edit",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.export",
      "command_path": "support template export",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a curated template as a .zip template file (default <slug>.zip); with_data also packages a capped copy of its rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateExportResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/{slug}/export",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminExportBundle",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a curated template as a .zip template file (default <slug>.zip); with_data also packages a capped copy of its rows.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateExportResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_export",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.export-dashboard",
      "command_path": "support template export-dashboard",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a dashboard you can edit as a .zip template file; slug (required) is the id an import matches on; with_data (default true) packages a capped copy of its rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateExportDashboardResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/dashboards/{dashboard_id}/export",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminExportDashboard",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Downloads a dashboard you can edit as a .zip template file; slug (required) is the id an import matches on; with_data (default true) packages a capped copy of its rows.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateExportDashboardResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_export_dashboard",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.import",
      "command_path": "support template import",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Imports a template file as a curated DRAFT (not published); an existing slug is updated in place. dataset names the data to bind a file that carries none. Inspect it first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateImportResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/templates/admin/import",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminImportBundle",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Imports a template file as a curated DRAFT (not published); an existing slug is updated in place. dataset names the data to bind a file that carries none. Inspect it first.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateImportResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_import",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.inspect",
      "command_path": "support template inspect",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Reads a template file without importing it: what it needs, whether it carries data and a picture, and whether the catalog already has it. Writes nothing. The file comes from the local disk.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateInspectResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/templates/admin/inspect",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminInspectBundle",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Reads a template file without importing it: what it needs, whether it carries data and a picture, and whether the catalog already has it. Writes nothing. The file comes from the local disk.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateInspectResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_inspect",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.list",
      "command_path": "support template list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every curated template, drafts and broken rows included, worst first, each with what is wrong and the action that fixes it.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateListResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminCatalog",
      "pagination_policy": "single_page",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every curated template, drafts and broken rows included, worst first, each with what is wrong and the action that fixes it.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.publish",
      "command_path": "support template publish",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Takes a curated draft live in every customer's gallery. Refused, with nothing published, when the template fails on its own data.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplatePublishResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/templates/admin/{slug}/publish",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminPublish",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Takes a curated draft live in every customer's gallery. Refused, with nothing published, when the template fails on its own data.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplatePublishResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_publish",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.retire",
      "command_path": "support template retire",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Keeps the row but stops the catalog offering or auditing it; reversible with support template unpublish.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateRetireResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/templates/admin/{slug}/retire",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminRetire",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Keeps the row but stops the catalog offering or auditing it; reversible with support template unpublish.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateRetireResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_retire",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "support.template.snapshots",
      "command_path": "support template snapshots",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every stored dataset the template catalog holds (curated and saved templates), and the templates holding none.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTemplateSnapshotsResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /dashboards/v3/templates/admin/snapshots",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "DashboardV3AdminSnapshots",
      "pagination_policy": "single_page",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Every stored dataset the template catalog holds (curated and saved templates), and the templates holding none.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTemplateSnapshotsResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_snapshots",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.thumbnail.clear",
      "command_path": "support template thumbnail clear",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Removes a curated template's picture; its card falls back to the og-card.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateThumbnailClearResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /dashboards/v3/templates/admin/{slug}/thumbnail",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminDeleteThumbnail",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Removes a curated template's picture; its card falls back to the og-card.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateThumbnailClearResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_thumbnail_clear",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.thumbnail.set",
      "command_path": "support template thumbnail set",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Uploads or replaces a curated template's picture: PNG, JPEG or WebP read from its content, 1 MB at most.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateThumbnailSetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /dashboards/v3/templates/admin/{slug}/thumbnail",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminPutThumbnail",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Uploads or replaces a curated template's picture: PNG, JPEG or WebP read from its content, 1 MB at most.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateThumbnailSetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_thumbnail_set",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.template.unpublish",
      "command_path": "support template unpublish",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Returns a live or retired curated template to draft; the board, canvas and row survive.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportTemplateUnpublishResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /dashboards/v3/templates/admin/{slug}/unpublish",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DashboardV3AdminUnpublish",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (Mammoth staff role); refused for every other user. Returns a live or retired curated template to draft; the board, canvas and row survive.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportTemplateUnpublishResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.template_unpublish",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.triage",
      "command_path": "support triage",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportTriageResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/triage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportTriage",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportTriageResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.triage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.usage-tiles",
      "command_path": "support usage-tiles",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportUsageTilesResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/usage-tiles",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportUsageTiles",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportUsageTilesResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.usage_tiles",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.user.list-all",
      "command_path": "support user list-all",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportUserListAllResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /settings/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListUsersOfWorkspaces",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportUserListAllResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.user_list_all",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.user.register",
      "command_path": "support user register",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Registers a new user account and may send them an invitation email. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportUserRegisterResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RegisterUser",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Registers a new user account and may send them an invitation email. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportUserRegisterResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.user_register",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.user.update",
      "command_path": "support user update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Changes another user's account details. Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportUserUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /support/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateUserVerification",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Changes another user's account details. Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportUserUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.user_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.activity",
      "command_path": "support workspace activity",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceActivityResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/activity",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportWorkspaceActivity",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceActivityResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_activity",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "returns_job",
      "canonical_command": "support.workspace.archive",
      "command_path": "support workspace archive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "returns_job",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the workspace's data to cold storage and takes it offline. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the archive has finished. Needs `storage_class` (GLACIER_IR or DEEP_ARCHIVE) and `confirm_name`, the workspace's exact name (case sensitive). `cancel_billing` also cancels billing. Read `support workspace archive-info WORKSPACE_ID` first. Reverse it with `support workspace restore-archive WORKSPACE_ID`.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceArchiveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/archive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportWorkspaceArchive",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Moves the workspace's data to cold storage and takes it offline. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the archive has finished. Needs `storage_class` (GLACIER_IR or DEEP_ARCHIVE) and `confirm_name`, the workspace's exact name (case sensitive). `cancel_billing` also cancels billing. Read `support workspace archive-info WORKSPACE_ID` first. Reverse it with `support workspace restore-archive WORKSPACE_ID`.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceArchiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_archive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.archive-info",
      "command_path": "support workspace archive-info",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceArchiveInfoResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/archive",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportWorkspaceArchiveInfo",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceArchiveInfoResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_archive_info",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.chargebee-cancelled",
      "command_path": "support workspace chargebee-cancelled",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Records the workspace's Chargebee subscription as cancelled; use it only after the cancellation was done in Chargebee.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceChargebeeCancelledResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/chargebee-cancelled",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportWorkspaceChargebeeCancelled",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Records the workspace's Chargebee subscription as cancelled; use it only after the cancellation was done in Chargebee.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceChargebeeCancelledResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_chargebee_cancelled",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.create",
      "command_path": "support workspace create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Support staff only. Creates a workspace with its owner and plan (payment_frequency monthly or yearly). Needs --yes and --confirm TARGET.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateWorkspaces",
      "pagination_policy": "none",
      "preconditions": "Support staff only. Creates a workspace with its owner and plan (payment_frequency monthly or yearly). Needs --yes and --confirm TARGET.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.deal-seed",
      "command_path": "support workspace deal-seed",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceDealSeedResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/deal-seed",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportWorkspaceDealSeed",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceDealSeedResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_deal_seed",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.delete",
      "command_path": "support workspace delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /support/workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteWorkspace",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.entitlement",
      "command_path": "support workspace entitlement",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceEntitlementResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/entitlement",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "SupportWorkspaceEntitlement",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceEntitlementResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_entitlement",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.get",
      "command_path": "support workspace get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceGetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaceDetail",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.invite.cancel",
      "command_path": "support workspace invite cancel",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the pending invite so its link stops working.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceInviteCancelResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /support/workspaces/{workspace_id}/users/invites/{invite_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportCancelWorkspaceInvite",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Cancels the pending invite so its link stops working.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceInviteCancelResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_invite_cancel",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.invite.resend",
      "command_path": "support workspace invite resend",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the invitee again at once.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceInviteResendResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/users/invites/{invite_id}/resend",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportResendWorkspaceInvite",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Emails the invitee again at once.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceInviteResendResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_invite_resend",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.list",
      "command_path": "support workspace list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaces",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.project.list",
      "command_path": "support workspace project list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceProjectListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/projects",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListProjects",
      "pagination_policy": "none",
      "preconditions": "Tech admin only (Mammoth staff role); refused for every other user.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceProjectListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_project_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.project.move-check",
      "command_path": "support workspace project move-check",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Pass the workspace the project is in and the project id as positionals and target_workspace_id in --input.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceProjectMoveCheckResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/projects/{project_id}/move",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "CheckProjectMove",
      "pagination_policy": "none",
      "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Pass the workspace the project is in and the project id as positionals and target_workspace_id in --input.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceProjectMoveCheckResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_check",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.project.move-start",
      "command_path": "support workspace project move-start",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Run `support workspace project move-check` first; acknowledged_warnings must hold the code of every warning. A project with an unfinished move resumes that move.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceProjectMoveStartResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/projects/{project_id}/move",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "StartProjectMove",
      "pagination_policy": "none",
      "preconditions": "Tech admin only (Mammoth staff role); refused for every other user. Run `support workspace project move-check` first; acknowledged_warnings must hold the code of every warning. A project with an unfinished move resumes that move.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceProjectMoveStartResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.project_move_start",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.restore-access",
      "command_path": "support workspace restore-access",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceRestoreAccessResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/restore-access",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RestoreWorkspaceAccess",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceRestoreAccessResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_restore_access",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "returns_job",
      "canonical_command": "support.workspace.restore-archive",
      "command_path": "support workspace restore-archive",
      "confirmation": "confirm_target",
      "contract": {
        "async": "returns_job",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Brings an archived workspace back from cold storage. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the restore has finished. Check `support workspace archive-info WORKSPACE_ID` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceRestoreArchiveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SupportWorkspaceArchiveRestore",
      "pagination_policy": "none",
      "preconditions": "Platform admin only (super or tech admin); a sales admin can read but not write. Brings an archived workspace back from cold storage. The server answers 202 and queues a job: poll `support workspace archive-info WORKSPACE_ID` until the restore has finished. Check `support workspace archive-info WORKSPACE_ID` first.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceRestoreArchiveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_restore_archive",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.suspend-access",
      "command_path": "support workspace suspend-access",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceSuspendAccessResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/suspend-access",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "SuspendWorkspaceAccess",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceSuspendAccessResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_suspend_access",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.update",
      "command_path": "support workspace update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /support/workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateWorkspaceDetail",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.user.add",
      "command_path": "support workspace user add",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserAddResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /support/workspaces/{workspace_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "AddUserToWorkspace",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceUserAddResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_add",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.user.list",
      "command_path": "support workspace user list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: WORKSPACE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "SupportWorkspaceUserListResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /support/workspaces/{workspace_id}/users",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetUserList",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: WORKSPACE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "SupportWorkspaceUserListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.user.remove",
      "command_path": "support workspace user remove",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserRemoveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /support/workspaces/{workspace_id}/users/{user_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RemoveWorkspaceUser",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceUserRemoveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_remove",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "support.workspace.user.transfer",
      "command_path": "support workspace user transfer",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "SupportWorkspaceUserTransferResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /support/workspaces/{workspace_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "TransferUserRoles",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKSPACE_ID, USER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "SupportWorkspaceUserTransferResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.support.SupportAPI.workspace_user_transfer",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "template.create",
      "command_path": "template create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/templates",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateTemplate",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "TemplateCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.templates.TemplatesAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "template.delete",
      "command_path": "template delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "TemplateDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.templates.TemplatesAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "template.get",
      "command_path": "template get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TemplateGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "TemplateGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.templates.TemplatesAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "template.list",
      "command_path": "template list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TemplateListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/templates",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListTemplates",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "TemplateListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.templates.TemplatesAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "template.update",
      "command_path": "template update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TemplateUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/templates/{template_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "TemplateUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.templates.TemplatesAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "token.create",
      "command_path": "token create",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The token is shown once, in this response only; store it at once. It is redacted from logs and diagnostics. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ClientAppCreateResult",
        "scope": "profile",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "The token is shown once, in this response only; store it at once. It is redacted from logs and diagnostics. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ClientAppCreateResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "token.list",
      "command_path": "token list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Lists the workspace's API tokens.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ClientAppListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "offset",
      "preconditions": "Lists the workspace's API tokens.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ClientAppListResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "token.revoke",
      "command_path": "token revoke",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Revokes the token for good; anything using it stops working. Needs --yes and --confirm with the exact token key.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ClientAppDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Revokes the token for good; anything using it stops working. Needs --yes and --confirm with the exact token key.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ClientAppDeleteResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "trash.add",
      "command_path": "trash add",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TrashAddResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "BulkTrash",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "TrashAddResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.trash.TrashAPI.add",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "trash.list",
      "command_path": "trash list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "TrashListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/trash",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListTrash",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "TrashListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.trash.TrashAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "trash.restore",
      "command_path": "trash restore",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "TrashRestoreResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/trash/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "BulkRestore",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "TrashRestoreResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.trash.TrashAPI.restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "upgrade",
      "command_path": "upgrade",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Installs a different mammoth CLI version from PyPI over the current one. Run `mammoth version` first. Needs a prompt or --yes; the install is skipped when the version is already current.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "UpgradeResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Installs a different mammoth CLI version from PyPI over the current one. Run `mammoth version` first. Needs a prompt or --yes; the install is skipped when the version is already current.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "UpgradeResult",
      "scope": "profile",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "user.avatar.delete",
      "command_path": "user avatar delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes the signed-in user's profile picture; upload it again to restore it. Needs a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserAvatarDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /self/avatar",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteAvatar",
      "pagination_policy": "none",
      "preconditions": "Removes the signed-in user's profile picture; upload it again to restore it. Needs a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "UserAvatarDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.users.UsersAPI.avatar_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "always_wait",
      "canonical_command": "user.avatar.upload",
      "command_path": "user avatar upload",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserAvatarUploadResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /self/avatar",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UploadProfilePic",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "UserAvatarUploadResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.users.UsersAPI.avatar_upload",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "user.delete-account",
      "command_path": "user delete-account",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes the signed-in user's account for good. Pass validate_only to check what would be removed first. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserDeleteAccountResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /self",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteSelf",
      "pagination_policy": "none",
      "preconditions": "Deletes the signed-in user's account for good. Pass validate_only to check what would be removed first. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "UserDeleteAccountResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.users.UsersAPI.delete_account",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "user.get",
      "command_path": "user get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "UserGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /self",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUserDetails",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "UserGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "user.preference.get",
      "command_path": "user preference get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "UserPreferenceGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /preferences",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetUserPreferences",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "UserPreferenceGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.get_preferences",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "user.preference.update",
      "command_path": "user preference update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Body is the release {\"patch\": [{\"op\", \"path\", \"value\"}]} list; the CLI does not validate preference paths (observed key GLOBAL.PREFERENCES.TOP_TABS). Not verified live.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserPreferenceUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /preferences",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateUserPreferences",
      "pagination_policy": "none",
      "preconditions": "Body is the release {\"patch\": [{\"op\", \"path\", \"value\"}]} list; the CLI does not validate preference paths (observed key GLOBAL.PREFERENCES.TOP_TABS). Not verified live.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "UserPreferenceUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.update_preferences",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "user.update",
      "command_path": "user update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "UserUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /self",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateUser",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "UserUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.user_profile.UserProfileAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "version",
      "command_path": "version",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "VersionResult",
        "scope": "local",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "VersionResult",
      "scope": "local",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.active-user.list",
      "command_path": "view active-user list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewActiveUserListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/activities",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetActiveUsers",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewActiveUserListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.active_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.active-user.mark",
      "command_path": "view active-user mark",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewActiveUserMarkResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/activities",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "MarkActiveUser",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewActiveUserMarkResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.mark_active",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.ai.generate-data",
      "command_path": "view ai generate-data",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Preview operation per the pinned OpenAPI document; must not claim that it writes generated rows to the view. Rows accepted 1-100.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewAiGenerateDataResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/generate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "Preview",
      "pagination_policy": "none",
      "preconditions": "Preview operation per the pinned OpenAPI document; must not claim that it writes generated rows to the view. Rows accepted 1-100.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewAiGenerateDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.ai.AIAPI.generate_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.ai.generation-info",
      "command_path": "view ai generation-info",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewAiGenerationInfoResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/generate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetValidationInfo",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewAiGenerationInfoResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.ai.AIAPI.get_data_gen_info",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.ai.profile",
      "command_path": "view ai profile",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewAiProfileResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/profile_generation",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "GenerateProfile",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewAiProfileResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.ai.AIAPI.generate_profile",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.analyze",
      "command_path": "view analyze",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Lists pipeline steps that can be dropped or moved without changing the result: findings of {rule, seqs, detail, proposed_order, safe}. Rules: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter. Only a safe finding is applied by view optimize. Also returns the view (name, dataset, rows, columns, state) and its pipeline step count, so no view get or task list follows. VIEW_ID may be several ids joined by commas: one result with an analysis per id, and an entry in errors for an id that failed.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewAnalyzeResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/analysis",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAnalysis",
      "pagination_policy": "none",
      "preconditions": "Read-only. Lists pipeline steps that can be dropped or moved without changing the result: findings of {rule, seqs, detail, proposed_order, safe}. Rules: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter. Only a safe finding is applied by view optimize. Also returns the view (name, dataset, rows, columns, state) and its pipeline step count, so no view get or task list follows. VIEW_ID may be several ids joined by commas: one result with an analysis per id, and an entry in errors for an id that failed.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewAnalyzeResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.analysis",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.bulk-delete",
      "command_path": "view bulk-delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATASET_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewBulkDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteMultipleDataviews",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATASET_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewBulkDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.bulk_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.checkpoint.create",
      "command_path": "view checkpoint create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddCheckpoint",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewCheckpointCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.checkpoint.delete",
      "command_path": "view checkpoint delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteCheckpoint",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewCheckpointDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.checkpoint.get",
      "command_path": "view checkpoint get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCheckpointGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineCheckpoint",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewCheckpointGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.checkpoint.list",
      "command_path": "view checkpoint list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCheckpointListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineCheckpoints",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewCheckpointListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.checkpoint.update",
      "command_path": "view checkpoint update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCheckpointUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/checkpoints/{checkpoint_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditPatches",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, CHECKPOINT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewCheckpointUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.checkpoints.CheckpointsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.column.format.set",
      "command_path": "view column format set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A view display setting (the web grid's column format menu), not a pipeline task: it changes how values show, not the stored values, and adds no task. Date columns take date_format (python style, %d-%b-%Y) or postgres_date_format (DD-Mon-YYYY); numeric columns take decimal_spec (decimal places), currency_symbol, is_percentage, thousands_separator, decimal_separator. Keys given replace the same keys of the column's format; the rest are kept. To change how TEXT is read as a date, use view transform convert-type.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewColumnFormatSetResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "A view display setting (the web grid's column format menu), not a pipeline task: it changes how values show, not the stored values, and adds no task. Date columns take date_format (python style, %d-%b-%Y) or postgres_date_format (DD-Mon-YYYY); numeric columns take decimal_spec (decimal places), currency_symbol, is_percentage, thousands_separator, decimal_separator. Keys given replace the same keys of the column's format; the rest are kept. To change how TEXT is read as a date, use view transform convert-type.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewColumnFormatSetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.compare",
      "command_path": "view compare",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Pass pairs in --input as [[view_a, view_b], ...] (1 to 20 pairs). Each result has status ok, not_ready (a view's latest data is not built; see problem_views) or not_comparable (a view has duplicate column names), then rows_a, rows_b, columns_only_in_a, columns_only_in_b, checksum_a, checksum_b, equal and mismatched_columns. Columns match by display name; floats are rounded to 6 places.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewCompareResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/dataviews/compare",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "CompareDataviews",
      "pagination_policy": "none",
      "preconditions": "Read-only. Pass pairs in --input as [[view_a, view_b], ...] (1 to 20 pairs). Each result has status ok, not_ready (a view's latest data is not built; see problem_views) or not_comparable (a view has duplicate column names), then rows_a, rows_b, columns_only_in_a, columns_only_in_b, checksum_a, checksum_b, equal and mismatched_columns. Columns match by display name; floats are rounded to 6 places.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewCompareResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.compare",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.conditional-format.create",
      "command_path": "view conditional-format create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "columns + operator + value + color colour each cell by its own value: one RULE per column, created in this one call (applies_to columns, the default). applies_to row makes one rule over any/all (match) of the columns. A raw rule body ({\"cf_type\": \"RULE\"|\"COLOR_SCALE\", \"payload\": {...}}) still works instead; applies_to must be row or columns.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateConditionalFormat",
      "pagination_policy": "none",
      "preconditions": "columns + operator + value + color colour each cell by its own value: one RULE per column, created in this one call (applies_to columns, the default). applies_to row makes one rule over any/all (match) of the columns. A raw rule body ({\"cf_type\": \"RULE\"|\"COLOR_SCALE\", \"payload\": {...}}) still works instead; applies_to must be row or columns.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewConditionalFormatCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.conditional-format.delete-all",
      "command_path": "view conditional-format delete-all",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact phrase DELETE ALL CONDITIONAL FORMATS required.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatDeleteAllResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteConditionalFormat",
      "pagination_policy": "none",
      "preconditions": "Exact phrase DELETE ALL CONDITIONAL FORMATS required.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewConditionalFormatDeleteAllResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.conditional-format.list",
      "command_path": "view conditional-format list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewConditionalFormatListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetConditionalFormat",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewConditionalFormatListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.conditional-format.replace",
      "command_path": "view conditional-format replace",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Same input as view conditional-format create (typed fields or a raw rule). Deletes every existing rule of the view, then creates the new ones, in one call; a refused rule leaves the rules created so far and the error names deleted_rule_ids and created_rule_ids. To add a rule beside the others use create.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewConditionalFormatReplaceResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Same input as view conditional-format create (typed fields or a raw rule). Deletes every existing rule of the view, then creates the new ones, in one call; a refused rule leaves the rules created so far and the error names deleted_rule_ids and created_rule_ids. To add a rule beside the others use create.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewConditionalFormatReplaceResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.conditional-format.update",
      "command_path": "view conditional-format update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]; reserved, not registered.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewConditionalFormatUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/conditional-format",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateConditionalFormat",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]; reserved, not registered.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewConditionalFormatUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.conditional_format_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.create",
      "command_path": "view create",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "To work on a dataset's changes without touching its own views, create a working view; clone_from (a view id of the same dataset) carries that view's steps. A dataset's own view is the default_view of view list, never the newest or an agent-made view: read it, or clone it with clone_from when steps are needed; edit it in place only when asked to change that view.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddDataview",
      "pagination_policy": "none",
      "preconditions": "To work on a dataset's changes without touching its own views, create a working view; clone_from (a view id of the same dataset) carries that view's steps. A dataset's own view is the default_view of view list, never the newest or an agent-made view: read it, or clone it with clone_from when steps are needed; edit it in place only when asked to change that view.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.client.ViewsResource.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "view.data.aggregate",
      "command_path": "view data aggregate",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only: computes and returns an aggregated result without adding a task to the view's pipeline or otherwise changing it. Pass exactly one of 'aggregations' (a PIVOT group-by; 'group_by' is optional) or 'metric' (a single METRIC value). 'function' is one of SUM, COUNT, AVG, MIN, MAX, STDDEV, DISTINCT_COUNT. A group_by item is a column name, or {\"column\": C, \"truncate\": DAY|WEEK|MONTH|QUARTER|YEAR} to bucket a DATE (a trend over time), or {\"column\": C, \"resolution\": N} to bucket a NUMERIC; grouping by a raw date gives one row per day. A metric is a number: only COUNT and DISTINCT_COUNT work on a DATE or TEXT column. For one column's trend, top values or spread, view data explore is the shorter call. order_by (result labels; a string like 'Total desc' or {column, direction}) with top ranks the groups on the backend; a limit without order_by keeps arbitrary rows and the result says ordered false. A group_by truncate on a TEXT column of dates is bucketed by the CLI: the stored format is detected from the data and stated in text_dates, an ambiguous day/month order (settle it with text_date_format) or an unreadable value fails loud, and a range condition (GT, GTE, LT, LTE, IN_RANGE with a YYYY-MM-DD value) on such a column works the same way. A truncate on a NUMERIC column, or a resolution on a non-NUMERIC one, is refused. To group by the part of a date, give {\"column\": C, \"part\": weekday|day|month|quarter|year} on a DATE or TEXT-date column: the groups are named (Monday, January, Q1) and in calendar order. This is the read-only way to answer by-weekday and by-month questions. An empty result carries observed_range: the min and max of the filtered or date column.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataAggregateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data/query",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ExecuteVolatileQuery",
      "pagination_policy": "none",
      "preconditions": "Read-only: computes and returns an aggregated result without adding a task to the view's pipeline or otherwise changing it. Pass exactly one of 'aggregations' (a PIVOT group-by; 'group_by' is optional) or 'metric' (a single METRIC value). 'function' is one of SUM, COUNT, AVG, MIN, MAX, STDDEV, DISTINCT_COUNT. A group_by item is a column name, or {\"column\": C, \"truncate\": DAY|WEEK|MONTH|QUARTER|YEAR} to bucket a DATE (a trend over time), or {\"column\": C, \"resolution\": N} to bucket a NUMERIC; grouping by a raw date gives one row per day. A metric is a number: only COUNT and DISTINCT_COUNT work on a DATE or TEXT column. For one column's trend, top values or spread, view data explore is the shorter call. order_by (result labels; a string like 'Total desc' or {column, direction}) with top ranks the groups on the backend; a limit without order_by keeps arbitrary rows and the result says ordered false. A group_by truncate on a TEXT column of dates is bucketed by the CLI: the stored format is detected from the data and stated in text_dates, an ambiguous day/month order (settle it with text_date_format) or an unreadable value fails loud, and a range condition (GT, GTE, LT, LTE, IN_RANGE with a YYYY-MM-DD value) on such a column works the same way. A truncate on a NUMERIC column, or a resolution on a non-NUMERIC one, is refused. To group by the part of a date, give {\"column\": C, \"part\": weekday|day|month|quarter|year} on a DATE or TEXT-date column: the groups are named (Monday, January, Q1) and in calendar order. This is the read-only way to answer by-weekday and by-month questions. An empty result carries observed_range: the min and max of the filtered or date column.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataAggregateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.aggregate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.data.compare",
      "command_path": "view data compare",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Every number reported to the user comes from a tool result: use this to compare the same PIVOT/METRIC aggregate across two views (e.g. two platforms' totals per campaign) instead of subtracting two 'view data aggregate' reads by hand -- calc is the tool for a single expression. Takes the exact same --input shape as view data aggregate (aggregations/group_by, or metric); rows are joined on the group-by key (or compared as a single row for a bare metric) using exact Decimal arithmetic. A key present in only one view's result is not an error: 'only_in_first' and 'only_in_second' give its exact count and the first 25 rows, and 'rows' holds the keys both views have.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCompareResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Every number reported to the user comes from a tool result: use this to compare the same PIVOT/METRIC aggregate across two views (e.g. two platforms' totals per campaign) instead of subtracting two 'view data aggregate' reads by hand -- calc is the tool for a single expression. Takes the exact same --input shape as view data aggregate (aggregations/group_by, or metric); rows are joined on the group-by key (or compared as a single row for a bare metric) using exact Decimal arithmetic. A key present in only one view's result is not an error: 'only_in_first' and 'only_in_second' give its exact count and the first 25 rows, and 'rows' holds the keys both views have.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataCompareResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.data.drivers",
      "command_path": "view data drivers",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Use this, not a series of view data aggregate reads, for \"why did X drop/rise\", \"what drove the change between July and August\", \"explain the decline\": one call returns the total for each period, the change and its percentage, whether it came from volume (the row count) or value (value per row), and per 'by' column the groups that moved most with their signed share_of_change. --input: \"measure\" {\"column\", \"function\": SUM or COUNT}; \"date_column\"; \"compare\" [A, B], each 'YYYY-MM', 'YYYY-Qn', 'YYYY' or {\"from\": \"YYYY-MM-DD\", \"to\": \"YYYY-MM-DD\"} (the change is read from A to B; any other form is refused); \"by\" 1 to 3 columns; optional \"conditions\" in view data aggregate's condition shape. partial_period names a period the data does not cover to its end (or from its start): say it is incomplete, never compare it as a whole period. Answer with the total change first, then the top contributors with their share, then volume vs value. Amounts carry the currency in 'currency'; when it is null give plain numbers and never invent a currency.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataDriversResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only. Use this, not a series of view data aggregate reads, for \"why did X drop/rise\", \"what drove the change between July and August\", \"explain the decline\": one call returns the total for each period, the change and its percentage, whether it came from volume (the row count) or value (value per row), and per 'by' column the groups that moved most with their signed share_of_change. --input: \"measure\" {\"column\", \"function\": SUM or COUNT}; \"date_column\"; \"compare\" [A, B], each 'YYYY-MM', 'YYYY-Qn', 'YYYY' or {\"from\": \"YYYY-MM-DD\", \"to\": \"YYYY-MM-DD\"} (the change is read from A to B; any other form is refused); \"by\" 1 to 3 columns; optional \"conditions\" in view data aggregate's condition shape. partial_period names a period the data does not cover to its end (or from its start): say it is incomplete, never compare it as a whole period. Answer with the total change first, then the top contributors with their share, then volume vs value. Amounts carry the currency in 'currency'; when it is null give plain numbers and never invent a currency.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataDriversResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.data.explore",
      "command_path": "view data explore",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only: reads one column's value distribution -- trend, distribution, histogram, or top values. It does not open or change any card in the UI; to open Explore cards use 'view explore-panel set'. It reads without adding a task to the view's pipeline (never use 'view transform pivot' just to explore). DATE column: counts per 'level' bucket (AUTO default; SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR, DECADE, CENTURY, MILLENNIUM) for \"what's trending\", \"over time\", \"by month\", \"by year\". NUMERIC column: counts per 'level' resolution (AUTO default; a power of 10) for a distribution or histogram. TEXT column: top values by count, 'limit' default 20 -- \"what's in this column\". Every bucket has 'count' and 'percentage' of the total. 'row_count' is the number of unique values (buckets). Options (--input): 'metric' {\"column\",\"function\"} adds a per-bucket SUM, COUNT, AVG, MIN, MAX, STDDEV or DISTINCT_COUNT over another column (the custom card); 'condition' filters rows first -- include/exclude values, blanks, a date or number range, text contains -- and several cards' selections combine as one AND condition (cross-filter); drill down by re-running at a finer 'level' with a 'condition' on the chosen bucket's range; 'percentage_of' \"metric\" makes 'percentage' the share of the 'metric' total (default: of the count); 'sort' count_desc, count_asc, value_asc, value_desc, metric_desc or metric_asc (blanks last; the card puts them first); 'limit' and 'offset' page the buckets (\"load more\"); 'range' true adds the exact earliest and latest value of a DATE or NUMERIC column under the same condition; '-o csv' prints the buckets as CSV; 'sequence' explores at a pipeline step. To exclude a value the way the card does (blank rows stay), use or(NE value, IS_EMPTY on that column): a plain NE, NOT_IN_LIST or not drops blank rows. To put the card on a dashboard, say it in words: 'dashboard chat edit DASHBOARD_ID' (prompt) or 'dashboard v3 generate'. Search several columns for text: or of CONTAINS per text column. Replace all values like this: 'view transform replace'. Related: distinct raw values of a DATE/NUMERIC column, a summary (min/max/sum/avg) or a matching-row count -> 'view data aggregate'; keep the filter as a pipeline step -> 'view transform filter'; save it as a new view -> 'view create' then 'view transform filter' on it; download all rows -> 'view export csv'. A TEXT column of dates takes a level (or column_type DATE): the format is detected from the data and stated in text_dates; ambiguous or unreadable dates fail loud. A column_type that disagrees with the stored type is refused, never dropped. Example: --input '{\"level\": \"MONTH\", \"condition\": {\"column\": \"Results\", \"operator\": \"EQ\", \"value\": \"Fail\"}}'. A figure for a period (year, quarter, month) is one explore of the DATE column with level YEAR, QUARTER or MONTH and a metric {\"column\": AMOUNT, \"function\": \"SUM\"}: it returns one figure per period and the date range the data covers, so no rows need paging. cumulative true adds a running total; keep one year or range with condition, for a year {\"column\": DATE_COLUMN, \"operator\": \"=\", \"value\": 2017, \"component\": \"year\"}. Figures come back rounded to two decimals: quote them as returned.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataExploreResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only: reads one column's value distribution -- trend, distribution, histogram, or top values. It does not open or change any card in the UI; to open Explore cards use 'view explore-panel set'. It reads without adding a task to the view's pipeline (never use 'view transform pivot' just to explore). DATE column: counts per 'level' bucket (AUTO default; SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR, DECADE, CENTURY, MILLENNIUM) for \"what's trending\", \"over time\", \"by month\", \"by year\". NUMERIC column: counts per 'level' resolution (AUTO default; a power of 10) for a distribution or histogram. TEXT column: top values by count, 'limit' default 20 -- \"what's in this column\". Every bucket has 'count' and 'percentage' of the total. 'row_count' is the number of unique values (buckets). Options (--input): 'metric' {\"column\",\"function\"} adds a per-bucket SUM, COUNT, AVG, MIN, MAX, STDDEV or DISTINCT_COUNT over another column (the custom card); 'condition' filters rows first -- include/exclude values, blanks, a date or number range, text contains -- and several cards' selections combine as one AND condition (cross-filter); drill down by re-running at a finer 'level' with a 'condition' on the chosen bucket's range; 'percentage_of' \"metric\" makes 'percentage' the share of the 'metric' total (default: of the count); 'sort' count_desc, count_asc, value_asc, value_desc, metric_desc or metric_asc (blanks last; the card puts them first); 'limit' and 'offset' page the buckets (\"load more\"); 'range' true adds the exact earliest and latest value of a DATE or NUMERIC column under the same condition; '-o csv' prints the buckets as CSV; 'sequence' explores at a pipeline step. To exclude a value the way the card does (blank rows stay), use or(NE value, IS_EMPTY on that column): a plain NE, NOT_IN_LIST or not drops blank rows. To put the card on a dashboard, say it in words: 'dashboard chat edit DASHBOARD_ID' (prompt) or 'dashboard v3 generate'. Search several columns for text: or of CONTAINS per text column. Replace all values like this: 'view transform replace'. Related: distinct raw values of a DATE/NUMERIC column, a summary (min/max/sum/avg) or a matching-row count -> 'view data aggregate'; keep the filter as a pipeline step -> 'view transform filter'; save it as a new view -> 'view create' then 'view transform filter' on it; download all rows -> 'view export csv'. A TEXT column of dates takes a level (or column_type DATE): the format is detected from the data and stated in text_dates; ambiguous or unreadable dates fail loud. A column_type that disagrees with the stored type is refused, never dropped. Example: --input '{\"level\": \"MONTH\", \"condition\": {\"column\": \"Results\", \"operator\": \"EQ\", \"value\": \"Fail\"}}'. A figure for a period (year, quarter, month) is one explore of the DATE column with level YEAR, QUARTER or MONTH and a metric {\"column\": AMOUNT, \"function\": \"SUM\"}: it returns one figure per period and the date range the data covers, so no rows need paging. cumulative true adds a running total; keep one year or range with condition, for a year {\"column\": DATE_COLUMN, \"operator\": \"=\", \"value\": 2017, \"component\": \"year\"}. Figures come back rounded to two decimals: quote them as returned.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataExploreResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.data.forecast",
      "command_path": "view data forecast",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Use this for \"forecast\", \"projection\", \"estimate next month\", \"what will revenue be in October\": never divide a partial period by its days or extend a trend by hand. --input: \"measure\" {\"column\", \"function\"} as view data aggregate takes; \"date_column\"; \"unit\" month (default), quarter or week; \"periods\" 1 to 12 (default 1); optional \"conditions\" in view data aggregate's condition shape. It reads the measure per period in one aggregate and fits an ordinary least-squares linear trend to the complete periods, adding a seasonal index only with two full cycles (24 months, 8 quarters, 104 weeks; otherwise seasonal is false), with a t-based 95% prediction interval (low, high). A last period the data does not cover to its end is left out of the fit and reported as excluded_partial (its value so far and data_through); it is the first period forecast. The forecast starts after the last period in the data: when the data ends in mid-September and the user asks for October, pass periods 2 and quote October. Fewer than 3 complete periods is refused. Give the estimate with its range, name the method, never present it as certain; amounts carry the currency in 'currency', and when it is null give plain numbers and never invent a currency.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataForecastResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only. Use this for \"forecast\", \"projection\", \"estimate next month\", \"what will revenue be in October\": never divide a partial period by its days or extend a trend by hand. --input: \"measure\" {\"column\", \"function\"} as view data aggregate takes; \"date_column\"; \"unit\" month (default), quarter or week; \"periods\" 1 to 12 (default 1); optional \"conditions\" in view data aggregate's condition shape. It reads the measure per period in one aggregate and fits an ordinary least-squares linear trend to the complete periods, adding a seasonal index only with two full cycles (24 months, 8 quarters, 104 weeks; otherwise seasonal is false), with a t-based 95% prediction interval (low, high). A last period the data does not cover to its end is left out of the fit and reported as excluded_partial (its value so far and data_through); it is the first period forecast. The forecast starts after the last period in the data: when the data ends in mid-September and the user asks for October, pass periods 2 and quote October. Fewer than 3 complete periods is refused. Give the estimate with its range, name the method, never present it as certain; amounts carry the currency in 'currency', and when it is null give plain numbers and never invent a currency.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataForecastResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "view.data.get",
      "command_path": "view data get",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDataviewData",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.get_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.data.profile",
      "command_path": "view data profile",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only profile of the WHOLE view (every row, not a page of 50): per column the blank count, distinct count, min and max (NUMERIC and DATE) and top values; a \"summary\" of constant, all-blank and mostly-blank columns; \"spelling_variants\" per TEXT column -- spellings of one value that differ by case, punctuation or legal form (Ltd = Limited, Inc = Incorporated ...) -- with a ready \"bulk_replace\" input and the full \"command\" to merge them. Use it to explore, understand or profile a dataset, find blanks, duplicates and dirty categories. Blanks, distinct counts and min/max come from the stats the backend stored for the view when their row count equals the view row count now; otherwise (stale after a pipeline step, or none stored) they are queried in a few multi-column pivots. The \"sources\" block says which, and that the backend records no as-of time; each column \"from\" says stored or query. Top values, spelling variants and the target comparison are always queried. --input: \"target\" (a column with 2-20 values, e.g. churn) adds the target distribution (positive_rate of its rarest class) and \"association\": \"categorical\" columns ranked by cramers_v (one grouped count per column) and \"numeric\" columns ranked by standardized_difference (two multi-column pivots) -- the churn drivers; \"columns\" (names) profiles only those; \"top\" values per column (default 5); \"limit\" columns shown in detail (default 50; the summary always covers all). A column with more than 5000 distinct values gets counts and min/max but no value list. Example: --input '{\"target\": \"CHURN\", \"limit\": 20}'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataProfileResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only profile of the WHOLE view (every row, not a page of 50): per column the blank count, distinct count, min and max (NUMERIC and DATE) and top values; a \"summary\" of constant, all-blank and mostly-blank columns; \"spelling_variants\" per TEXT column -- spellings of one value that differ by case, punctuation or legal form (Ltd = Limited, Inc = Incorporated ...) -- with a ready \"bulk_replace\" input and the full \"command\" to merge them. Use it to explore, understand or profile a dataset, find blanks, duplicates and dirty categories. Blanks, distinct counts and min/max come from the stats the backend stored for the view when their row count equals the view row count now; otherwise (stale after a pipeline step, or none stored) they are queried in a few multi-column pivots. The \"sources\" block says which, and that the backend records no as-of time; each column \"from\" says stored or query. Top values, spelling variants and the target comparison are always queried. --input: \"target\" (a column with 2-20 values, e.g. churn) adds the target distribution (positive_rate of its rarest class) and \"association\": \"categorical\" columns ranked by cramers_v (one grouped count per column) and \"numeric\" columns ranked by standardized_difference (two multi-column pivots) -- the churn drivers; \"columns\" (names) profiles only those; \"top\" values per column (default 5); \"limit\" columns shown in detail (default 50; the summary always covers all). A column with more than 5000 distinct values gets counts and min/max but no value list. Example: --input '{\"target\": \"CHURN\", \"limit\": 20}'.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataProfileResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "view.data.query",
      "command_path": "view data query",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "B11 QUERY_OFFSET_SEMANTICS: one-indexed (offset=1) with no proven continuation; --all is blocked.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataQueryResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/data",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetDataviewDataPost",
      "pagination_policy": "offset",
      "preconditions": "B11 QUERY_OFFSET_SEMANTICS: one-indexed (offset=1) with no proven continuation; --all is blocked.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataQueryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.query_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.data-check.create",
      "command_path": "view data-check create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "body needs a placement: pinned_to_end true or a task_sequence (4GENR007 \"Either task_sequence or pinned_to_end must be set\" otherwise). An alert the user asks for (\"tell me when late deliveries go above 10\") is a data check: pinned_to_end true, fail_behavior \"flag_and_continue\" (the default \"halt\" stops the pipeline), and one row_count check with condition \"lte\" and value 10 whose config condition_sql filters the rows to count, e.g. \"\\\"Status\\\" = 'Late'\" (column display names). It is re-tested after every pipeline run and source refresh, and its owner gets an in-app notice when it starts failing (once, not on every failing run). Say it fires when the count goes above the value, not below.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddDataCheck",
      "pagination_policy": "none",
      "preconditions": "body needs a placement: pinned_to_end true or a task_sequence (4GENR007 \"Either task_sequence or pinned_to_end must be set\" otherwise). An alert the user asks for (\"tell me when late deliveries go above 10\") is a data check: pinned_to_end true, fail_behavior \"flag_and_continue\" (the default \"halt\" stops the pipeline), and one row_count check with condition \"lte\" and value 10 whose config condition_sql filters the rows to count, e.g. \"\\\"Status\\\" = 'Late'\" (column display names). It is re-tested after every pipeline run and source refresh, and its owner gets an in-app notice when it starts failing (once, not on every failing run). Say it fires when the count goes above the value, not below.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDataCheckCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.data-check.delete",
      "command_path": "view data-check delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDataCheck",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDataCheckDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.data-check.get",
      "command_path": "view data-check get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCheckGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineDataCheck",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, DATA_CHECK_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataCheckGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.data-check.list",
      "command_path": "view data-check list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDataCheckListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineDataChecks",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDataCheckListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.data-check.update",
      "command_path": "view data-check update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}, the same body the web app sends. On release the PATCH returns HTTP 500 (outcome_unknown) from backend validation that runs after the change is committed; read the check back with view data-check get before retrying.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDataCheckUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/data-checks/{data_check_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditDatacheck",
      "pagination_policy": "none",
      "preconditions": "patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}, the same body the web app sends. On release the PATCH returns HTTP 500 (outcome_unknown) from backend validation that runs after the change is committed; read the check back with view data-check get before retrying.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDataCheckUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.data_checks.DataChecksAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.delete",
      "command_path": "view delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Immutable view-ID confirmation. Supplying dataset_id uses the exact nested endpoint and skips parent discovery; omitting it retains legacy parent discovery.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDataview",
      "pagination_policy": "none",
      "preconditions": "Immutable view-ID confirmation. Supplying dataset_id uses the exact nested endpoint and skips parent discovery; omitting it retains legacy parent discovery.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.client.ViewsResource.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.derivative.create",
      "command_path": "view derivative create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "ARGUMENT and any column reference in the METRIC expression are internal names (metadata[].internal_name from view get, e.g. column_1), not display names; a display name makes the backend fail with HTTP 500. The result is {\"id\": N, \"card\": bool}; read the value with view derivative data. A METRIC shows as an explore-panel card only through display_properties; when it is absent or null the CLI defaults it to the metric card (type metric, info.title = the AS name); pass display_properties to override. card says whether a card exists (verify.card mirrors it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateDerivative",
      "pagination_policy": "none",
      "preconditions": "ARGUMENT and any column reference in the METRIC expression are internal names (metadata[].internal_name from view get, e.g. column_1), not display names; a display name makes the backend fail with HTTP 500. The result is {\"id\": N, \"card\": bool}; read the value with view derivative data. A METRIC shows as an explore-panel card only through display_properties; when it is absent or null the CLI defaults it to the metric card (type metric, info.title = the AS name); pass display_properties to override. card says whether a card exists (verify.card mirrors it).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDerivativeCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.derivative.data",
      "command_path": "view derivative data",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "body is {\"condition\": CONDITION_OR_NULL, \"limit\": null}, the same document the web app posts; {\"limit\": null} is the minimal accepted body and an empty body is rejected (4GENR007). Returns STATUS, the metric row(s) under data and their metadata.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeDataResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}/data",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "FetchDerivativeData",
      "pagination_policy": "none",
      "preconditions": "body is {\"condition\": CONDITION_OR_NULL, \"limit\": null}, the same document the web app posts; {\"limit\": null} is the minimal accepted body and an empty body is rejected (4GENR007). Returns STATUS, the metric row(s) under data and their metadata.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDerivativeDataResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.derivative.delete",
      "command_path": "view derivative delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteDerivative",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDerivativeDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.derivative.list",
      "command_path": "view derivative list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDerivativeListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListDerivatives",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDerivativeListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.derivative.update",
      "command_path": "view derivative update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDerivativeUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/derivatives/{derivative_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditDerivative",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, DERIVATIVE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDerivativeUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.derivatives.DerivativesAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.draft.auto-run",
      "command_path": "view draft auto-run",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires exactly one of --enabled/--disabled, no implicit default.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftAutoRunResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Requires exactly one of --enabled/--disabled, no implicit default.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewDraftAutoRunResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.draft.command",
      "command_path": "view draft command",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewDraftCommandResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/draft-mode",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ExecutePipelineDraftCommand",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewDraftCommandResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.command",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.draft.discard",
      "command_path": "view draft discard",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "always_wait",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prompt or --yes because queued tasks are deleted.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftDiscardResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Prompt or --yes because queued tasks are deleted.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewDraftDiscardResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.draft.enter",
      "command_path": "view draft enter",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Idempotent only when server state proves it is already active.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftEnterResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Idempotent only when server state proves it is already active.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewDraftEnterResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.draft.status",
      "command_path": "view draft status",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Server-backed draft-status seam used by 'view draft status'.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewDraftStatusResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Server-backed draft-status seam used by 'view draft status'.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewDraftStatusResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.draft.submit",
      "command_path": "view draft submit",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires server draft state before mutation.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewDraftSubmitResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Requires server draft state before mutation.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewDraftSubmitResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.explore-panel.add-to-dashboard",
      "command_path": "view explore-panel add-to-dashboard",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Puts one open Explore card on a dashboard as a figure, like the card menu's Add to dashboard. Input {\"card\": COLUMN NAME} and either \"dashboard_id\" (an existing board of this view) or \"new_dashboard_title\" (a new blank board; a title the project already has is refused); \"page\": {\"id\": N} or {\"new_title\": \"...\"} goes with dashboard_id. The card becomes the figure the web app makes: a text list a top 10 bar (donut top 7, treemap top 24), a date a bar or line by year or month, a number a bar over fixed ranges. The result carries the figure, \"notes\" (what does not carry over: top N, date unit, fixed ranges, filters left off), dashboard_id and created_dashboard. A filter card (search, scatter, ask), a card whose column is gone and a card with a value the dashboard cannot show are refused with the web app's reason. Wait for the bake with job wait.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelAddToDashboardResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Puts one open Explore card on a dashboard as a figure, like the card menu's Add to dashboard. Input {\"card\": COLUMN NAME} and either \"dashboard_id\" (an existing board of this view) or \"new_dashboard_title\" (a new blank board; a title the project already has is refused); \"page\": {\"id\": N} or {\"new_title\": \"...\"} goes with dashboard_id. The card becomes the figure the web app makes: a text list a top 10 bar (donut top 7, treemap top 24), a date a bar or line by year or month, a number a bar over fixed ranges. The result carries the figure, \"notes\" (what does not carry over: top N, date unit, fixed ranges, filters left off), dashboard_id and created_dashboard. A filter card (search, scatter, ask), a card whose column is gone and a card with a value the dashboard cannot show are refused with the web app's reason. Wait for the bake with job wait.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExplorePanelAddToDashboardResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.explore-panel.edit",
      "command_path": "view explore-panel edit",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes the Explore cards the way the card menus do, with display names and no card JSON, and writes the panel once. The card must be open (view explore-panel set). Input {\"edits\": [...]}, applied in order; each edit is {\"op\", \"card\": COLUMN NAME, ...}. metric: {\"agg\": COUNT} or {\"agg\": SUM|AVG|MIN|MAX|STDDEV|DISTINCT_COUNT, \"of\": NUMERIC COLUMN} (DISTINCT_COUNT takes any column). sort: {\"by\": metric|value, \"direction\": ASC|DESC}, list views only. view: {\"view\": list|columns|timeline|donut|treemap}, which depends on the column type. level: {\"level\": a date level or a number bucket width}. filter / exclude: {\"values\": [...]} for text, {\"from\", \"to\"} for ranges, {\"blanks\": true} for blanks; clear: the filter off; remove: the card off. Query cards: {\"op\": \"search\", \"text\": \"...\", \"columns\": [...]}, {\"op\": \"scatter\", \"x\": NUMERIC, \"y\": NUMERIC, \"box\": {...}} and {\"op\": \"ask\", \"question\": \"...\"} (the question goes to the same suggestions call the web app makes and its condition is kept). An unknown column, a column of the wrong type or a value outside the web app's options is refused with the valid choices. The result carries \"panel\", the panel read back. It is a per-user preference: it does not change the view or what other users see.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelEditResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Changes the Explore cards the way the card menus do, with display names and no card JSON, and writes the panel once. The card must be open (view explore-panel set). Input {\"edits\": [...]}, applied in order; each edit is {\"op\", \"card\": COLUMN NAME, ...}. metric: {\"agg\": COUNT} or {\"agg\": SUM|AVG|MIN|MAX|STDDEV|DISTINCT_COUNT, \"of\": NUMERIC COLUMN} (DISTINCT_COUNT takes any column). sort: {\"by\": metric|value, \"direction\": ASC|DESC}, list views only. view: {\"view\": list|columns|timeline|donut|treemap}, which depends on the column type. level: {\"level\": a date level or a number bucket width}. filter / exclude: {\"values\": [...]} for text, {\"from\", \"to\"} for ranges, {\"blanks\": true} for blanks; clear: the filter off; remove: the card off. Query cards: {\"op\": \"search\", \"text\": \"...\", \"columns\": [...]}, {\"op\": \"scatter\", \"x\": NUMERIC, \"y\": NUMERIC, \"box\": {...}} and {\"op\": \"ask\", \"question\": \"...\"} (the question goes to the same suggestions call the web app makes and its condition is kept). An unknown column, a column of the wrong type or a value outside the web app's options is refused with the valid choices. The result carries \"panel\", the panel read back. It is a per-user preference: it does not change the view or what other users see.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExplorePanelEditResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "view.explore-panel.export-image",
      "command_path": "view explore-panel export-image",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes the open Explore card \"card\" (its column display name) as an SVG file at \"output_path\" (default explore-card-VIEW_ID.svg). The backend has no rasterizer, so this writes SVG only; the web app's PNG is a browser screenshot. A bar card becomes a bar chart (one bar per group, its value the card's metric); a list card becomes a table of its rows. The rows are read as view data explore reads them, so the list is the top values the backend returns (TEXT: 20). \"style_id\" optionally renders with a saved style. The card must be open (view explore-panel set). Not available inside the Mammoth app: it writes a file on the host. It is a per-user preference read; it does not change the view or the panel.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExplorePanelExportImageResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /dashboards/v3/render/svg",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "RenderFigureSvg",
      "pagination_policy": "none",
      "preconditions": "Writes the open Explore card \"card\" (its column display name) as an SVG file at \"output_path\" (default explore-card-VIEW_ID.svg). The backend has no rasterizer, so this writes SVG only; the web app's PNG is a browser screenshot. A bar card becomes a bar chart (one bar per group, its value the card's metric); a list card becomes a table of its rows. The rows are read as view data explore reads them, so the list is the top values the backend returns (TEXT: 20). \"style_id\" optionally renders with a saved style. The card must be open (view explore-panel set). Not available inside the Mammoth app: it writes a file on the host. It is a per-user preference read; it does not change the view or the panel.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExplorePanelExportImageResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dashboards.DashboardsAPI.render_figure_svg",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.explore-panel.get",
      "command_path": "view explore-panel get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. Returns the Explore panel the caller saved on this view, {height, cards}, or {} when none is saved. It is a per-user preference: other users do not see it. VIEW_ID is the only id needed.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExplorePanelGetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only. Returns the Explore panel the caller saved on this view, {height, cards}, or {} when none is saved. It is a per-user preference: other users do not see it. VIEW_ID is the only id needed.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExplorePanelGetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.explore-panel.set",
      "command_path": "view explore-panel set",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Saves the Explore cards of the calling user for a view; it shows nothing by itself. Open a card per column with {\"panel\": {\"columns\": \"all\"}} or {\"panel\": {\"columns\": [\"Region\", \"Amount\"]}}: each named column that has no card gets one and the saved cards stay. To replace the whole panel, run view explore-panel get first and write back {\"panel\": {\"cards\": [...]}}. A panel with no cards list is refused, because the web app shows only cards. The result carries \"panel\", the panel read back after the write (what get returns): check its cards to see which are open. It is a per-user preference: it does not change the view or what other users see.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExplorePanelSetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Saves the Explore cards of the calling user for a view; it shows nothing by itself. Open a card per column with {\"panel\": {\"columns\": \"all\"}} or {\"panel\": {\"columns\": [\"Region\", \"Amount\"]}}: each named column that has no card gets one and the saved cards stay. To replace the whole panel, run view explore-panel get first and write back {\"panel\": {\"cards\": [...]}}. A panel with no cards list is refused, because the web app shows only cards. The result carries \"panel\", the panel read back after the write (what get returns): check its cards to see which are open. It is a per-user preference: it does not change the view or what other users see.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExplorePanelSetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.azure-blob",
      "command_path": "view export azure-blob",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportAzureBlobResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportAzureBlobResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.bigquery",
      "command_path": "view export bigquery",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Require upsert keys for UPSERT and type both partition variants. With export_type REPLACE (the default) it drops and recreates the destination table on this export and on every later run of the view's pipeline; refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportBigqueryResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Require upsert keys for UPSERT and type both partition variants. With export_type REPLACE (the default) it drops and recreates the destination table on this export and on every later run of the view's pipeline; refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportBigqueryResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "returns_job",
      "canonical_command": "view.export.create",
      "command_path": "view export create",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Replace open destination dictionaries with the typed destination union.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportCreateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "AddExport",
      "pagination_policy": "none",
      "preconditions": "Replace open destination dictionaries with the typed destination union.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.export.csv",
      "command_path": "view export csv",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "SDK target for view export csv VIEW_ID; uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportCsvResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "SDK target for view export csv VIEW_ID; uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportCsvResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.export.dataset",
      "command_path": "view export dataset",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Mutation class dynamic: benign_mutation for a new target, destructive when replacing an existing target. Omit dataset_name unless the user gave one; the product default 'Result Dataset' is used (never invent a name such as the view's name). The export is appended to the source pipeline (end_of_pipeline) and re-runs with it; target_project_id sends the dataset into another project (cross-project branch-out, proven on release). Result: {dataset_id, project_id, source_view_id, next}. Not a plain copy: this leaves a live export on the source and the new dataset refreshes from the source view, so keep that working view and name it as the new dataset's source. For an independent copy of a dataset use dataset create with ds_creation_type clone. Writing into an existing dataset (target_ds_id, save_as_mode APPEND_TO_DS or REPLACE_IN_DS; both run the same backend append code, so both get these guards): omit column_mapping and every column is mapped by name; a non-empty column_mapping is used as-is, so it must map every source column to an existing target column, and a partial mapping or an unknown destination is refused (append_mapping_incomplete) before anything is written. A target column that nothing fills (a column the source view lacks and column_mapping does not target) would be NULL in every appended row: refused (append_leaves_columns_blank) unless the input lists exactly those column names in blank_columns (a blanket true or a different list is refused); the confirmed blanks are named in row_check.warnings. Do not reshape the source view to dodge this. A mapped pair of different types is reported in row_check.warnings. A new dataset (no target_ds_id) leaves out the view's hidden columns; they are named in row_check.warnings. To stack two datasets (a union, new rows below the old): there is no union step, so export the second dataset's view into the first with save_as_mode APPEND_TO_DS and target_ds_id the first dataset (columns are matched by name). The export stays a step of the source view and runs again when that view's pipeline re-runs, so after a refresh check the target's row count for rows added twice. A real union step needs backend work.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportDatasetResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Mutation class dynamic: benign_mutation for a new target, destructive when replacing an existing target. Omit dataset_name unless the user gave one; the product default 'Result Dataset' is used (never invent a name such as the view's name). The export is appended to the source pipeline (end_of_pipeline) and re-runs with it; target_project_id sends the dataset into another project (cross-project branch-out, proven on release). Result: {dataset_id, project_id, source_view_id, next}. Not a plain copy: this leaves a live export on the source and the new dataset refreshes from the source view, so keep that working view and name it as the new dataset's source. For an independent copy of a dataset use dataset create with ds_creation_type clone. Writing into an existing dataset (target_ds_id, save_as_mode APPEND_TO_DS or REPLACE_IN_DS; both run the same backend append code, so both get these guards): omit column_mapping and every column is mapped by name; a non-empty column_mapping is used as-is, so it must map every source column to an existing target column, and a partial mapping or an unknown destination is refused (append_mapping_incomplete) before anything is written. A target column that nothing fills (a column the source view lacks and column_mapping does not target) would be NULL in every appended row: refused (append_leaves_columns_blank) unless the input lists exactly those column names in blank_columns (a blanket true or a different list is refused); the confirmed blanks are named in row_check.warnings. Do not reshape the source view to dodge this. A mapped pair of different types is reported in row_check.warnings. A new dataset (no target_ds_id) leaves out the view's hidden columns; they are named in row_check.warnings. To stack two datasets (a union, new rows below the old): there is no union step, so export the second dataset's view into the first with save_as_mode APPEND_TO_DS and target_ds_id the first dataset (columns are matched by name). The export stays a step of the source view and runs again when that view's pipeline re-runs, so after a refresh check the target's row count for rows added twice. A real union step needs backend work.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportDatasetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "view.export.delete",
      "command_path": "view export delete",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportDeleteResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "DeleteExport",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.export.download",
      "command_path": "view export download",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "SDK target for view export download VIEW_ID. The format goes in the input, e.g. mammoth view export download 123 --input '{\"file_type\": \"xlsx\"}' (csv, xlsx, json, ndjson, xml, yaml or parquet; csv by default). Uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportDownloadResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "SDK target for view export download VIEW_ID. The format goes in the input, e.g. mammoth view export download 123 --input '{\"file_type\": \"xlsx\"}' (csv, xlsx, json, ndjson, xml, yaml or parquet; csv by default). Uses partial file, fsync, atomic rename, and explicit --overwrite; an existing output file is refused with file_exists unless --overwrite is given.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportDownloadResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.elasticsearch",
      "command_path": "view export elasticsearch",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Validate protocol and positive chunk size.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportElasticsearchResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Validate protocol and positive chunk size.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportElasticsearchResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.email",
      "command_path": "view export email",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Outbound email stays contract-only until a dedicated sink and recipient allowlist exist.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportEmailResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Outbound email stays contract-only until a dedicated sink and recipient allowlist exist.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportEmailResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.ftp",
      "command_path": "view export ftp",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportFtpResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportFtpResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.export.get",
      "command_path": "view export get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineExport",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExportGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.export.list",
      "command_path": "view export list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Lists the saved exports of one view (internal datasets, databases, cloud storage, REST); read-only.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineExports",
      "pagination_policy": "offset",
      "preconditions": "Lists the saved exports of one view (internal datasets, databases, cloud storage, REST); read-only.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExportListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.export.live-link",
      "command_path": "view export live-link",
      "confirmation": "yes_always",
      "contract": {
        "async": "always_wait",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs a plan that includes live links; the backend's refusal is returned as is.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportLiveLinkResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Needs a plan that includes live links; the backend's refusal is returned as is.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportLiveLinkResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.export.managed-s3",
      "command_path": "view export managed-s3",
      "confirmation": "yes_always",
      "contract": {
        "async": "always_wait",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Alias `view export s3`. A download-only destination starts and waits; any other destination sends data outside Mammoth and needs confirmation.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportManagedS3Result",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Alias `view export s3`. A download-only destination starts and waits; any other destination sends data outside Mammoth and needs confirmation.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportManagedS3Result",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.mssql",
      "command_path": "view export mssql",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportMssqlResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportMssqlResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.mysql",
      "command_path": "view export mysql",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportMysqlResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportMysqlResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.onedrive",
      "command_path": "view export onedrive",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportOnedriveResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportOnedriveResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.postgres",
      "command_path": "view export postgres",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportPostgresResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so. Table names over 60 characters are refused (table_name_too_long): the database export would cut them and write a different table.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportPostgresResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.powerbi",
      "command_path": "view export powerbi",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Needs the Power BI account username and password, the Azure AD app's client_id, and the target Power BI dataset and table; the password is a secret field, so pass it in the request file, never in argv. Becomes a persistent pipeline step, like 'view export dataset'; the target refreshes automatically every time the source view's pipeline reruns, not just once at call time.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportPowerbiResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Needs the Power BI account username and password, the Azure AD app's client_id, and the target Power BI dataset and table; the password is a secret field, so pass it in the request file, never in argv. Becomes a persistent pipeline step, like 'view export dataset'; the target refreshes automatically every time the source view's pipeline reruns, not just once at call time.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportPowerbiResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "view.export.publish-db",
      "command_path": "view export publish-db",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Becomes a persistent pipeline step, like 'view export dataset'; the published target refreshes automatically every time the source view's pipeline reruns, not just once at call time. It drops and recreates the destination table each time (any existing table of that name is lost), so it is refused unless the input sets replace_table to true (replace_table_not_acknowledged).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportPublishDbResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/publish-to-db",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "CreatePublishToDb",
      "pagination_policy": "none",
      "preconditions": "Becomes a persistent pipeline step, like 'view export dataset'; the published target refreshes automatically every time the source view's pipeline reruns, not just once at call time. It drops and recreates the destination table each time (any existing table of that name is lost), so it is refused unless the input sets replace_table to true (replace_table_not_acknowledged).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportPublishDbResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.publish_db",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "view.export.publish-db-update",
      "command_path": "view export publish-db-update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportPublishDbUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/publish-to-db",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "UpdatePublishToDb",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportPublishDbUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.publish_db_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.redshift",
      "command_path": "view export redshift",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportRedshiftResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Drops and recreates the destination table on this export and on every later run of the view's pipeline (any existing table of that name is lost); refused unless the input sets replace_table to true (replace_table_not_acknowledged). The result carries refreshes_on_pipeline_run and a note saying so.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportRedshiftResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.rest",
      "command_path": "view export rest",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Type all auth variants, reject secrets in static headers/query/body, allow insecure TLS only with --yes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportRestResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Type all auth variants, reject secrets in static headers/query/body, allow insecure TLS only with --yes.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportRestResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "always_wait",
      "canonical_command": "view.export.rest-fill",
      "command_path": "view export rest-fill",
      "confirmation": "yes_always",
      "contract": {
        "async": "always_wait",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Makes Mammoth's server fetch the docs URL and propose REST export settings; nothing is configured or sent. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportRestFillResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/rest-fill",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "Suggest",
      "pagination_policy": "none",
      "preconditions": "Makes Mammoth's server fetch the docs URL and propose REST export settings; nothing is configured or sent. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportRestFillResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.rest_fill",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.export.runs",
      "command_path": "view export runs",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportRunsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}/runs",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListExportRuns",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID, EXPORT_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExportRunsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.runs",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.sftp",
      "command_path": "view export sftp",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Enforce authentication-mode union (password vs key) and forbid irrelevant secrets.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportSftpResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Enforce authentication-mode union (password vs key) and forbid irrelevant secrets.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportSftpResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.sharepoint",
      "command_path": "view export sharepoint",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Validate site URL.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportSharepointResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Validate site URL.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportSharepointResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": null,
      "async": "returns_job",
      "canonical_command": "view.export.tableau",
      "command_path": "view export tableau",
      "confirmation": "yes_always",
      "contract": {
        "async": "returns_job",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prohibit secret in CA bundle file.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewExportTableauResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Prohibit secret in CA bundle file.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewExportTableauResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "view.export.update",
      "command_path": "view export update",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "external_effect",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Merge-style: --input is the fields to change (save_as_mode, target_properties, additional_properties, condition, end_of_pipeline, sequence, run_immediately, schedule, send_window) or {\"patches\": [...]}. A replace of params keeps what it leaves out from the stored export and keeps the export pinned to the end of the pipeline unless it sets end_of_pipeline false (sequence null means pinned; a number unpins, and a sequence without end_of_pipeline false is refused). The stored schedule and send_window are sent back with the edit. A command patch needs no value: {\"op\":\"command\",\"path\":\"run\"} (also suspend, restore, discard).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportUpdateResult",
        "scope": "project",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "external_effect",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/exports/{export_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "external_effect",
      "operation_id": "EditExport",
      "pagination_policy": "none",
      "preconditions": "Merge-style: --input is the fields to change (save_as_mode, target_properties, additional_properties, condition, end_of_pipeline, sequence, run_immediately, schedule, send_window) or {\"patches\": [...]}. A replace of params keeps what it leaves out from the stored export and keeps the export pinned to the end of the pipeline unless it sets end_of_pipeline false (sequence null means pinned; a number unpins, and a sequence without end_of_pipeline false is refused). The stored schedule and send_window are sent back with the edit. A command patch needs no value: {\"op\":\"command\",\"path\":\"run\"} (also suspend, restore, discard).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "returns_job",
      "canonical_command": "view.exportable-config.apply",
      "command_path": "view exportable-config apply",
      "confirmation": "confirm_target",
      "contract": {
        "async": "returns_job",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exactly one of items or config is required; explicit dataset parent is preferred. config must be the full document returned by view exportable-config get (metadata, display_properties, dependencies, tasks, checkpoints, derivatives, data_checks) with your edits applied; the job rejects a bare {\"tasks\": []} (verified on release 2026-09-19). Round-trip get -> edit -> apply.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewExportableConfigApplyResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/exportable-config",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": "ApplyExportableConfig",
      "pagination_policy": "none",
      "preconditions": "Exactly one of items or config is required; explicit dataset parent is preferred. config must be the full document returned by view exportable-config get (metadata, display_properties, dependencies, tasks, checkpoints, derivatives, data_checks) with your edits applied; the job rejects a bare {\"tasks\": []} (verified on release 2026-09-19). Round-trip get -> edit -> apply.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewExportableConfigApplyResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.apply_exportable_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "returns_job"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.exportable-config.get",
      "command_path": "view exportable-config get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "View-centric read; dataset_id may be supplied as the explicit parent.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewExportableConfigGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/exportable-config",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetExportableConfig",
      "pagination_policy": "none",
      "preconditions": "View-centric read; dataset_id may be supplied as the explicit parent.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewExportableConfigGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.get_exportable_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.get",
      "command_path": "view get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "BLOCKED[B10 VIEW_DATASET_RESOLUTION]: calls the private pipeline discovery helper.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDataviewInformationIndividual",
      "pagination_policy": "none",
      "preconditions": "BLOCKED[B10 VIEW_DATASET_RESOLUTION]: calls the private pipeline discovery helper.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.client.ViewsResource.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.impact",
      "command_path": "view impact",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. What deleting a pipeline task (scope task, with task_id) or the whole view (scope view) would affect: dashboards, exports, dependent views and automations. Pass scope in --input. Run it before view task delete or view trash, and say what it lists before asking to go ahead.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewImpactResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/impact",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDataviewDeleteImpact",
      "pagination_policy": "none",
      "preconditions": "Read-only. What deleting a pipeline task (scope task, with task_id) or the whole view (scope view) would affect: dashboards, exports, dependent views and automations. Pass scope in --input. Run it before view task delete or view trash, and say what it lists before asking to go ahead.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewImpactResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.delete_impact",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.list",
      "command_path": "view list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "B01. Each view names its dataset (dataset_id and dataset_name) and carries rows and cols, created and updated time, the dataset's source kind, its column names with types and stored per-column sample_values (one stored-stats read per listed view, all made at once, no query), plus built_from and feeds (the view ids it reads and the ones that read it), pipeline_status when not ready, and in_sync false when its data is stale; cut to fit the agent tool output cap (next_dataset_offset and views_omitted say where the rest is). Newest first. full true returns the raw records.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListDataviews",
      "pagination_policy": "single_page",
      "preconditions": "B01. Each view names its dataset (dataset_id and dataset_name) and carries rows and cols, created and updated time, the dataset's source kind, its column names with types and stored per-column sample_values (one stored-stats read per listed view, all made at once, no query), plus built_from and feeds (the view ids it reads and the ones that read it), pipeline_status when not ready, and in_sync false when its data is stale; cut to fit the agent tool output cap (next_dataset_offset and views_omitted say where the rest is). Newest first. full true returns the raw records.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "start_or_wait",
      "canonical_command": "view.optimize",
      "command_path": "view optimize",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "start_or_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "VIEW_ID is the only id needed; the CLI looks up the dataset. If DATASET_ID is given it comes second (the SDK method takes them the other way round) and must be the dataset of that view. Writes the pipeline: applies the safe findings of view analyze (all of them, or only the rules in the apply_rules input field: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter) and reruns the view. Waits for the rerun job and adds job_state and job_result. The result lists applied, skipped (rule, seqs, reason), before_steps and after_steps. Run view analyze first and say what it found before asking to go ahead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewOptimizeResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/optimize",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": "OptimizePipeline",
      "pagination_policy": "none",
      "preconditions": "VIEW_ID is the only id needed; the CLI looks up the dataset. If DATASET_ID is given it comes second (the SDK method takes them the other way round) and must be the dataset of that view. Writes the pipeline: applies the safe findings of view analyze (all of them, or only the rules in the apply_rules input field: drop_suspended, drop_duplicate, drop_noop_filter, hoist_filter) and reruns the view. Waits for the rerun job and adds job_state and job_result. The result lists applied, skipped (rule, seqs, reason), before_steps and after_steps. Run view analyze first and say what it found before asking to go ahead.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewOptimizeResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.optimize",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "start_or_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.parameter-context",
      "command_path": "view parameter-context",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewParameterContextResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/parameter-context",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetParameterContext",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewParameterContextResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.parameter_context",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.pipeline.edit",
      "command_path": "view pipeline edit",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Strict nonempty patches; each allowed path has a discriminated model and its own safety class (operation-dependent).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewPipelineEditResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditPipeline",
      "pagination_policy": "none",
      "preconditions": "Strict nonempty patches; each allowed path has a discriminated model and its own safety class (operation-dependent).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewPipelineEditResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.edit_pipeline",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.pipeline.get",
      "command_path": "view pipeline get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipeline",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewPipelineGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.get_pipeline",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.pipeline.items",
      "command_path": "view pipeline items",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires the exact parent dataset_id through --input; follow and validate every next-page URL before counting saved task definitions. The CLI does not paginate automatically.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineItemsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/items",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineItems",
      "pagination_policy": "none",
      "preconditions": "Requires the exact parent dataset_id through --input; follow and validate every next-page URL before counting saved task definitions. The CLI does not paginate automatically.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewPipelineItemsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.items",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.pipeline.items-all",
      "command_path": "view pipeline items-all",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Reuses the exact-parent items route with bounded offset pagination; rejects repeated/non-advancing pages and excessive page counts. The CLI view.pipeline.items command remains single-page.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineItemsAllResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "offset",
      "preconditions": "Reuses the exact-parent items route with bounded offset pagination; rejects repeated/non-advancing pages and excessive page counts. The CLI view.pipeline.items command remains single-page.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewPipelineItemsAllResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.pipeline.rerun",
      "command_path": "view pipeline rerun",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "A rerun fires every end-of-pipeline export of the view again (database, email, REST, dataset); the result lists them in exports_fired (export_id, handler_type, target) so the external effect is visible. --dry-run returns the same exports_fired without running. An internal_dataset export that appends or replaces into an existing dataset also carries blank_columns: the sorted destination column names the write would leave NULL ([] when none).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewPipelineRerunResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/rerun",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RerunFromSequence",
      "pagination_policy": "none",
      "preconditions": "A rerun fires every end-of-pipeline export of the view again (database, email, REST, dataset); the result lists them in exports_fired (export_id, handler_type, target) so the external effect is visible. --dry-run returns the same exports_fired without running. An internal_dataset export that appends or replaces into an existing dataset also carries blank_columns: the sorted destination column names the write would leave NULL ([] when none).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewPipelineRerunResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.rerun",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.pipeline.wait",
      "command_path": "view pipeline wait",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Global --pipeline-timeout supplies timeout; do not expose poll_interval in v1.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPipelineWaitResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Global --pipeline-timeout supplies timeout; do not expose poll_interval in v1.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewPipelineWaitResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.preview",
      "command_path": "view preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewPreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetDataviewPreview",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.preview",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.restore",
      "command_path": "view restore",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewRestoreResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/restore",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RestoreDataview",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewRestoreResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.restore",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.summary",
      "command_path": "view summary",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewSummaryResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/summary",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPanelSummary",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewSummaryResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.summary",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.task.add",
      "command_path": "view task add",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Strict task discriminated union only.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskAddResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": "AddTask",
      "pagination_policy": "none",
      "preconditions": "Strict task discriminated union only.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewTaskAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.add_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.task.delete",
      "command_path": "view task delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "always_wait",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteTask",
      "pagination_policy": "none",
      "preconditions": "Prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewTaskDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.delete_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.task.get",
      "command_path": "view task get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery when reconciling saved task definitions.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineTask",
      "pagination_policy": "none",
      "preconditions": "Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery when reconciling saved task definitions.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewTaskGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.get_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.task.list",
      "command_path": "view task list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "single_page until B5; no --all until continuation is proven. Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery for saved-task reads.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineTasks",
      "pagination_policy": "single_page",
      "preconditions": "single_page until B5; no --all until continuation is proven. Requires the exact parent dataset_id through --input; do not rely on implicit parent discovery for saved-task reads.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewTaskListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.list_tasks",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "always_wait",
      "canonical_command": "view.task.preview",
      "command_path": "view task preview",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewTaskPreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/task_preview",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetTaskPreview",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewTaskPreviewResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.preview_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.task.preview-cancel",
      "command_path": "view task preview-cancel",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: DATAVIEW_ID, JOB_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskPreviewCancelResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/task_preview/{job_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CancelTaskPreview",
      "pagination_policy": "none",
      "preconditions": "Required inputs: DATAVIEW_ID, JOB_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewTaskPreviewCancelResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.preview_cancel",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.task.update",
      "command_path": "view task update",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Strict replacement task union. task_spec may be the params `view task get` returns: the server-written keys (EXECUTION_TIMESTAMP, TASK_NAMESPACE) are dropped before the send and TASK_KEY is kept (the server ignores it). A refusal names the keys sent beyond the envelope. To change a SQL step: get the task, edit task_spec.SQL.QUERY (keep DATAVIEW_ID and SEQUENCE_NUMBER), send it back.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTaskUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/tasks/{task_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": "EditTask",
      "pagination_policy": "none",
      "preconditions": "Strict replacement task union. task_spec may be the params `view task get` returns: the server-written keys (EXECUTION_TIMESTAMP, TASK_NAMESPACE) are dropped before the send and TASK_KEY is kept (the server ignores it). A refusal names the keys sent beyond the envelope. To change a SQL step: get the task, edit task_spec.SQL.QUERY (keep DATAVIEW_ID and SEQUENCE_NUMBER), send it back.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewTaskUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline.PipelineAPI.update_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.add-column",
      "command_path": "view transform add-column",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the new column name is unused and the types of any column it is built from.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAddColumnResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the new column name is unused and the types of any column it is built from.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformAddColumnResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.add-sql",
      "command_path": "view transform add-sql",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Single-view SQL: the only table is \"view:VIEW_ID\" (the view the task is added to); a second view in FROM or JOIN is rejected (5GENR010 \"only one table allowed\"), use view transform join for that. UNION ALL over the same view, CASE, DATE_TRUNC, GROUP BY and COUNT(DISTINCT ...) run on release. Result columns must be NUMERIC, TEXT or TIMESTAMPTZ: CAST(x AS DATE) is rejected (5GENR010 \"Invalid column type DATE\"); CAST(x AS TIMESTAMPTZ) or DATE_TRUNC land as a DATE column. The task replaces every column of the view; run it on a copy (view export dataset) when the source columns are still needed. Read the result back with view data get. Evidence: docs/capability-evidence/ilg-sim-20260919.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAddSqlResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Single-view SQL: the only table is \"view:VIEW_ID\" (the view the task is added to); a second view in FROM or JOIN is rejected (5GENR010 \"only one table allowed\"), use view transform join for that. UNION ALL over the same view, CASE, DATE_TRUNC, GROUP BY and COUNT(DISTINCT ...) run on release. Result columns must be NUMERIC, TEXT or TIMESTAMPTZ: CAST(x AS DATE) is rejected (5GENR010 \"Invalid column type DATE\"); CAST(x AS TIMESTAMPTZ) or DATE_TRUNC land as a DATE column. The task replaces every column of the view; run it on a copy (view export dataset) when the source columns are still needed. Read the result back with view data get. Evidence: docs/capability-evidence/ilg-sim-20260919.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformAddSqlResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.ai",
      "command_path": "view transform ai",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; record addon and data-processing notice in help (data can be processed by an AI feature).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformAiResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; record addon and data-processing notice in help (data can be processed by an AI feature).",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformAiResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.batch",
      "command_path": "view transform batch",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use when several transforms go on one view in a row (filter, then limit, then a sort): one call, one pipeline run, one verified outcome (row_check, and tasks with each new task's transform_status) instead of one call and one run per step. --input: \"steps\", a list of {\"op\", \"input\"}; op is filter, sort, limit-rows, discard-duplicates, fill-missing, bulk-replace, replace, text, substring, extract-date, increment-date, copy-columns, split, unnest or pivot, and input is exactly what that view transform command takes (display names). unnest and pivot replace the view's columns, so they can only be the last step, and no sort step may come before them.  Every step is checked against the view's columns as they are NOW before anything is sent, so a step can use a column an earlier step adds (split, copy-columns, or the new_column of substring, extract-date, increment-date) but no other column that does not exist yet. A sort is the view's row order, not a task: it is set after the tasks have run. A batch skips the per-op no-op check (a filter that matches every row still adds its task). If a task fails the batch's tasks are removed, the view is as before, and the error names steps[i] (batch_step_failed). In draft mode the tasks are staged, not run.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformBatchResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use when several transforms go on one view in a row (filter, then limit, then a sort): one call, one pipeline run, one verified outcome (row_check, and tasks with each new task's transform_status) instead of one call and one run per step. --input: \"steps\", a list of {\"op\", \"input\"}; op is filter, sort, limit-rows, discard-duplicates, fill-missing, bulk-replace, replace, text, substring, extract-date, increment-date, copy-columns, split, unnest or pivot, and input is exactly what that view transform command takes (display names). unnest and pivot replace the view's columns, so they can only be the last step, and no sort step may come before them.  Every step is checked against the view's columns as they are NOW before anything is sent, so a step can use a column an earlier step adds (split, copy-columns, or the new_column of substring, extract-date, increment-date) but no other column that does not exist yet. A sort is the view's row order, not a task: it is set after the tasks have run. A batch skips the per-op no-op check (a filter that matches every row still adds its task). If a task fails the batch's tasks are removed, the view is as before, and the error names steps[i] (batch_step_failed). In draft mode the tasks are staged, not run.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformBatchResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.bulk-replace",
      "command_path": "view transform bulk-replace",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Complete flags/defaults/result/draft/undo/live contract is specified in plan 02's 'Complete bulk-replace command contract'; this appendix does not narrow or replace it. columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformBulkReplaceResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Complete flags/defaults/result/draft/undo/live contract is specified in plan 02's 'Complete bulk-replace command contract'; this appendix does not narrow or replace it. columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformBulkReplaceResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.combine-columns",
      "command_path": "view transform combine-columns",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; reject the SDK's undocumented __literal__: source escape at the CLI boundary. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCombineColumnsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; reject the SDK's undocumented __literal__: source escape at the CLI boundary. Exactly one of new_column or existing_column is required; both or neither is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformCombineColumnsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.convert-type",
      "command_path": "view transform convert-type",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to count values that will not convert (they become empty). A DATE conversion of a text column takes input_formats (list of the layouts it mixes), output_format (display layout) and input_format_preference (uk or us for day/month ambiguity; strict blanks ambiguous day/month values and converts equal-part dates) on the conversions entry; format (python-style date_format) still works.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformConvertTypeResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to count values that will not convert (they become empty). A DATE conversion of a text column takes input_formats (list of the layouts it mixes), output_format (display layout) and input_format_preference (uk or us for day/month ambiguity; strict blanks ambiguous day/month values and converts equal-part dates) on the conversions entry; format (python-style date_format) still works.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformConvertTypeResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.copy-columns",
      "command_path": "view transform copy-columns",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the source columns exist and the new names are unused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCopyColumnsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the source columns exist and the new names are unused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformCopyColumnsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.crosstab",
      "command_path": "view transform crosstab",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Dynamic safety class: new target needs no confirmation, append needs --yes, replacing an existing target needs --yes --confirm TARGET_DS_ID. The crosstab is a standing export on the source view: it rewrites the output dataset on every pipeline run, and the result says so (refreshes_on_pipeline_run, note). A target the view already exports into, the view's own dataset, and a view held in a draft are refused, as for view export dataset.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformCrosstabResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Dynamic safety class: new target needs no confirmation, append needs --yes, replacing an existing target needs --yes --confirm TARGET_DS_ID. The crosstab is a standing export on the source view: it rewrites the output dataset on every pipeline run, and the result says so (refreshes_on_pipeline_run, note). A target the view already exports into, the view's own dataset, and a view held in a draft are refused, as for view export dataset.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformCrosstabResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.date-diff",
      "command_path": "view transform date-diff",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). start/end must both be existing DATE columns; there is no today input here. To diff against the current execution time (e.g. days since order), the server task itself supports it but this typed command does not expose it: use view task add with a raw task_spec: {\"DATE_DIFF\": {\"COMPONENT\": \"DAY\", \"MINUEND\": {\"TYPE\": \"__TIME__\"}, \"SUBTRAHEND\": {\"TYPE\": \"COLUMN\", \"VALUE\": \"INTERNAL_COLUMN_NAME\"}, \"AS\": {\"COLUMN\": \"Days Since Order\", \"TYPE\": \"NUMERIC\", \"INTERNAL_NAME\": \"column_days_since_order\"}}}, where INTERNAL_COLUMN_NAME is that column's internal_name from view get (not its display name -- a raw task skips display-name resolution). MINUEND minus SUBTRAHEND; swap them to flip the sign. Evidence: mvc-service api/api/dataview/helpers/validators/date_diff.py (allowed TYPE values COLUMN/VALUE/SYSTEM_TIME) and CommonConstants/dba_const.py KEYWORDS.SYSTEM_TIME = \"__TIME__\".",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDateDiffResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). start/end must both be existing DATE columns; there is no today input here. To diff against the current execution time (e.g. days since order), the server task itself supports it but this typed command does not expose it: use view task add with a raw task_spec: {\"DATE_DIFF\": {\"COMPONENT\": \"DAY\", \"MINUEND\": {\"TYPE\": \"__TIME__\"}, \"SUBTRAHEND\": {\"TYPE\": \"COLUMN\", \"VALUE\": \"INTERNAL_COLUMN_NAME\"}, \"AS\": {\"COLUMN\": \"Days Since Order\", \"TYPE\": \"NUMERIC\", \"INTERNAL_NAME\": \"column_days_since_order\"}}}, where INTERNAL_COLUMN_NAME is that column's internal_name from view get (not its display name -- a raw task skips display-name resolution). MINUEND minus SUBTRAHEND; swap them to flip the sign. Evidence: mvc-service api/api/dataview/helpers/validators/date_diff.py (allowed TYPE values COLUMN/VALUE/SYSTEM_TIME) and CommonConstants/dba_const.py KEYWORDS.SYSTEM_TIME = \"__TIME__\".",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformDateDiffResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.delete-columns",
      "command_path": "view transform delete-columns",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; task deletion restores columns only when the task ID is stable.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDeleteColumnsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Standard transformation policy; task deletion restores columns only when the task ID is stable.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformDeleteColumnsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.discard-duplicates",
      "command_path": "view transform discard-duplicates",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` (or `view data aggregate` counting rows grouped by the key columns) to count the duplicate rows this will drop. Edits the view in place: to keep the original, `view create` a copy first. Input: \"key_columns\" (only these columns decide a duplicate; every other column is ignored) or \"ignore_columns\" (these columns are left out of the comparison), not both. A batch step takes ignore_columns only.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformDiscardDuplicatesResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` (or `view data aggregate` counting rows grouped by the key columns) to count the duplicate rows this will drop. Edits the view in place: to keep the original, `view create` a copy first. Input: \"key_columns\" (only these columns decide a duplicate; every other column is ignored) or \"ignore_columns\" (these columns are left out of the comparison), not both. A batch step takes ignore_columns only.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformDiscardDuplicatesResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.extract-date",
      "command_path": "view transform extract-date",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE (run convert-type first if TEXT) and `view data get` to check a few values. For a month bucket use `year_month_number` (\"2026-10\"), which sorts in time order; `year_month` (\"2026, October\") sorts alphabetically on a chart axis.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformExtractDateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE (run convert-type first if TEXT) and `view data get` to check a few values. For a month bucket use `year_month_number` (\"2026-10\"), which sorts in time order; `year_month` (\"2026, October\") sorts alphabetically on a chart axis.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformExtractDateResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.fill-missing",
      "command_path": "view transform fill-missing",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` for the blank count of the column, so the result can be compared to it.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFillMissingResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` for the blank count of the column, so the result can be compared to it.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformFillMissingResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.filter",
      "command_path": "view transform filter",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows that match with `view data aggregate` using the same condition, and the total with no condition.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFilterResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows that match with `view data aggregate` using the same condition, and the total with no condition.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformFilterResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.first-name",
      "command_path": "view transform first-name",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use for \"extract the first name\" or the first word of a text column. --input: \"column\" (a TEXT column, required) and exactly one of \"new_column\" or \"existing_column\". Takes the text up to the first space. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformFirstNameResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use for \"extract the first name\" or the first word of a text column. --input: \"column\" (a TEXT column, required) and exactly one of \"new_column\" or \"existing_column\". Takes the text up to the first space. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformFirstNameResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.generate-sql",
      "command_path": "view transform generate-sql",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Writes and validates a SQL query from the intent and returns it as data.sql; it does not change the view (release, 2026-09-25: no task was added). Apply the query with view transform add-sql (data.apply is the exact command); add-sql replaces the view's columns with the result.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformGenerateSqlResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Writes and validates a SQL query from the intent and returns it as data.sql; it does not change the view (release, 2026-09-25: no task was added). Apply the query with view transform add-sql (data.apply is the exact command); add-sql replaces the view's columns with the result.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformGenerateSqlResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.increment-date",
      "command_path": "view transform increment-date",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE, and `view data get` to check a few values.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformIncrementDateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` to confirm the column type is DATE, and `view data get` to check a few values.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformIncrementDateResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.join",
      "command_path": "view transform join",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`) and run this with `--dry-run` for `join_preview.match_rate`.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformJoinResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`) and run this with `--dry-run` for `join_preview.match_rate`.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformJoinResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.json-extract",
      "command_path": "view transform json-extract",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). json_type=LIST (JSON_LIST_TO_ROWS) gives one row per list element, landing in an Item column (plus an Index column for its original position); with no keys/extractions this is the default. An object element does not get columns from this call -- run a second json-extract (json_type=OBJECT) on Item to turn its keys into columns. An extraction key is one object key (a string) or a path to a nested value, a non-empty JSON list of keys (strings) and array indexes (integers from 0), for example \"key\" [\"company\", \"location\", \"country\"] or [\"orders\", 0, \"total\"]. A path with no as_name names its column company.location.country.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformJsonExtractResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). json_type=LIST (JSON_LIST_TO_ROWS) gives one row per list element, landing in an Item column (plus an Index column for its original position); with no keys/extractions this is the default. An object element does not get columns from this call -- run a second json-extract (json_type=OBJECT) on Item to turn its keys into columns. An extraction key is one object key (a string) or a path to a nested value, a non-empty JSON list of keys (strings) and array indexes (integers from 0), for example \"key\" [\"company\", \"location\", \"country\"] or [\"orders\", 0, \"total\"]. A path with no as_name names its column company.location.country.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformJsonExtractResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.limit-rows",
      "command_path": "view transform limit-rows",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the current row count, so the row count after can be checked against N. `limit` is accepted as an alias of `n`; give one, not both.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformLimitRowsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the current row count, so the row count after can be checked against N. `limit` is accepted as an alias of `n`; give one, not both.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformLimitRowsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.lookup",
      "command_path": "view transform lookup",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`); the lookup view must have one row per key. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformLookupResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: read both key columns (`view data get`, `view data profile`); the lookup view must have one row per key. Exactly one of new_column or existing_column is required; both or neither is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformLookupResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.math",
      "command_path": "view transform math",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the types of the columns in the expression, and run it with `--dry-run` to validate the expression. Exactly one of new_column or existing_column is required; both or neither is refused. A parameter is written {name} in the expression (a project or workspace parameter of that name; an unknown name is refused): the step uses its value and re-runs when the value changes.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformMathResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the types of the columns in the expression, and run it with `--dry-run` to validate the expression. Exactly one of new_column or existing_column is required; both or neither is refused. A parameter is written {name} in the expression (a project or workspace parameter of that name; an unknown name is refused): the step uses its value and re-runs when the value changes.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformMathResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.pivot",
      "command_path": "view transform pivot",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Replaces the view's columns with the summary, so run it last (export rows first). Every as_name must be a display name that does not already exist on the view (4DTVW018 SAME_DISPLAY_NAME_CANNOT_BE_REUSED): aggregate a joined column under a new name.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformPivotResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Replaces the view's columns with the summary, so run it last (export rows first). Every as_name must be a display name that does not already exist on the view (4DTVW018 SAME_DISPLAY_NAME_CANNOT_BE_REUSED): aggregate a joined column under a new name.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformPivotResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.transform.rename-columns",
      "command_path": "view transform rename-columns",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's column rename), not a pipeline task: it changes no data and adds no task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformRenameColumnsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's column rename), not a pipeline task: it changes no data and adds no task.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformRenameColumnsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.repeat-rows",
      "command_path": "view transform repeat-rows",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Adds rows: the view ends with its row count times the copies. Give exactly one of times (2 to 10000 copies, writes no column), values (1 to 1000 unique values; TEXT or NUMERIC) or series (a date range: start, end, delta of one of years, months, weeks, days; or a number range: start, end, step above 0). values and series need exactly one of new_column or existing_column (new_column_type TEXT or NUMERIC for values; a series implies DATE or NUMERIC). keep_original is for values into existing_column only. order (GROUPED or INTERLEAVED) is not for times. A series bound may be {\"kind\": \"START_OF_YEAR\"} or {\"kind\": \"EARLIEST\", \"column\": \"<date column>\"} for start and {\"kind\": \"TODAY\"} for end. No condition. Observe first: `view get VIEW_ID` for the row count, since the result is limited to 10 million rows.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformRepeatRowsResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Adds rows: the view ends with its row count times the copies. Give exactly one of times (2 to 10000 copies, writes no column), values (1 to 1000 unique values; TEXT or NUMERIC) or series (a date range: start, end, delta of one of years, months, weeks, days; or a number range: start, end, step above 0). values and series need exactly one of new_column or existing_column (new_column_type TEXT or NUMERIC for values; a series implies DATE or NUMERIC). keep_original is for values into existing_column only. order (GROUPED or INTERLEAVED) is not for times. A series bound may be {\"kind\": \"START_OF_YEAR\"} or {\"kind\": \"EARLIEST\", \"column\": \"<date column>\"} for start and {\"kind\": \"TODAY\"} for end. No condition. Observe first: `view get VIEW_ID` for the row count, since the result is limited to 10 million rows.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformRepeatRowsResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.replace",
      "command_path": "view transform replace",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformReplaceResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformReplaceResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.set-values",
      "command_path": "view transform set-values",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows the condition matches with `view data aggregate` using the same condition. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSetValuesResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: count the rows the condition matches with `view data aggregate` using the same condition. Exactly one of new_column or existing_column is required; both or neither is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformSetValuesResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.small-large",
      "command_path": "view transform small-large",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see its type and range.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSmallLargeResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see its type and range.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformSmallLargeResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "view.transform.sort",
      "command_path": "view transform sort",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's sort), not a pipeline task: data reads and exports return rows in this order. At most three columns. `sort_by` is accepted as an alias of `order_by`; each entry is [column, ASC|DESC] or a string \"column\", \"column asc\" or \"column desc\". A string ending in asc or desc is read as column plus direction, so for a column whose name ends in asc or desc use the pair form [column, ASC|DESC].",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSortResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). A view display setting (the web grid's sort), not a pipeline task: data reads and exports return rows in this order. At most three columns. `sort_by` is accepted as an alias of `order_by`; each entry is [column, ASC|DESC] or a string \"column\", \"column asc\" or \"column desc\". A string ending in asc or desc is read as column plus direction, so for a column whose name ends in asc or desc use the pair form [column, ASC|DESC].",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformSortResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.split",
      "command_path": "view transform split",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the separator appears in real values.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSplitResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the separator appears in real values.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformSplitResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.substring",
      "command_path": "view transform substring",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see the real value lengths and formats.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformSubstringResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see the real value lengths and formats.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformSubstringResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.text",
      "command_path": "view transform text",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see the current values (case, padding, spelling variants).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformTextResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data profile VIEW_ID` on the column to see the current values (case, padding, spelling variants).",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformTextResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.unnest",
      "command_path": "view transform unnest",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the nested values are stored.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformUnnestResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view data get VIEW_ID` on the column to see how the nested values are stored.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformUnnestResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.update-column",
      "command_path": "view transform update-column",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use to overwrite a numeric column with an expression over its own values (\"add 5 to Cost\"). --input: \"column\" (an existing column, required) and \"expression\" (required, as in view transform math). Same as view transform math with existing_column set. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformUpdateColumnResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Use to overwrite a numeric column with an expression over its own values (\"add 5 to Cost\"). --input: \"column\" (an existing column, required) and \"expression\" (required, as in view transform math). Same as view transform math with existing_column set. One call: if the view is in draft mode the step is staged (status staged) and the draft stays unsubmitted, whether or not it already held staged steps; run view draft submit when that is intended. Outside draft mode the result waits on this step's own run (run.transform_status DONE), not on the pipeline reading ready.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformUpdateColumnResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.transform.window",
      "command_path": "view transform window",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "reversible_pipeline",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the column types, and `view data profile` for blanks in the partition and order columns. Exactly one of new_column or existing_column is required; both or neither is refused.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewTransformWindowResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "reversible_pipeline",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "reversible_pipeline",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view and its dataset's output. To make a NEW dataset and leave the source untouched: `mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it). Observe first: `view get VIEW_ID` for the column types, and `view data profile` for blanks in the partition and order columns. Exactly one of new_column or existing_column is required; both or neither is refused.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewTransformWindowResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.trash",
      "command_path": "view trash",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewTrashResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/trash",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "TrashDataview",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewTrashResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.trash",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.update",
      "command_path": "view update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Only the typed rename is offered (--input {\"name\": ...}); any other patch is refused with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "Patch",
      "pagination_policy": "none",
      "preconditions": "Only the typed rename is offered (--input {\"name\": ...}); any other patch is refused with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.dataviews.DataviewsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "always_wait",
      "canonical_command": "view.variants.create",
      "command_path": "view variants create",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Use when the user wants the same view once per value (\"per region\", \"one view for each segment\") and separate views are needed; for one view the viewer filters, use dashboard filter add. --input: \"from_view\" (a view of DATASET_ID whose steps every variant copies, required), \"column\" (a column of that view, required), \"values\" (1 to 50 distinct values, required), optional \"name_template\" (default \"{view} - {value}\"; must make distinct names, so keep {value}). Each variant is a new view cloned from from_view, then filtered to column = value. Refuses an unknown column before creating anything. Stops at the first failure with variants_partial_failure, whose details list the views already created, the failed value, the values not attempted and the unfiltered view left by the failed value (delete it, then rerun the rest). Returns view_ids and per-value variants.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "ViewVariantsCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Use when the user wants the same view once per value (\"per region\", \"one view for each segment\") and separate views are needed; for one view the viewer filters, use dashboard filter add. --input: \"from_view\" (a view of DATASET_ID whose steps every variant copies, required), \"column\" (a column of that view, required), \"values\" (1 to 50 distinct values, required), optional \"name_template\" (default \"{view} - {value}\"; must make distinct names, so keep {value}). Each variant is a new view cloned from from_view, then filtered to column = value. Refuses an unknown column before creating anything. Stops at the first failure with variants_partial_failure, whose details list the views already created, the failed value, the values not attempted and the unfiltered view left by the failed value (delete it, then rerun the rest). Returns view_ids and per-value variants.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "ViewVariantsCreateResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "view.version.apply",
      "command_path": "view version apply",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionApplyResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ApplyPipelineVersion",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewVersionApplyResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.apply",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.version.delete",
      "command_path": "view version delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeletePipelineVersion",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewVersionDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.version.get",
      "command_path": "view version get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewVersionGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineVersion",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewVersionGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "view.version.list",
      "command_path": "view version list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Required inputs: VIEW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "ViewVersionListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetPipelineVersions",
      "pagination_policy": "single_page",
      "preconditions": "Required inputs: VIEW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "ViewVersionListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "view.version.update",
      "command_path": "view version update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "ViewVersionUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/datasets/{dataset_id}/dataviews/{dataview_id}/pipeline/versions/{version_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "EditPipelineVersion",
      "pagination_policy": "none",
      "preconditions": "Required inputs: VIEW_ID, VERSION_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "ViewVersionUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.pipeline_versions.PipelineVersionsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "webhook.create",
      "command_path": "webhook create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Secure creation uses the secret-output rule (--secret-out/--show-secret).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookCreateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/webhooks",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateAWebhook",
      "pagination_policy": "none",
      "preconditions": "Secure creation uses the secret-output rule (--secret-out/--show-secret).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WebhookCreateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "webhook.delete",
      "command_path": "webhook delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Resolve webhook before confirmation.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookDeleteResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteWebhook",
      "pagination_policy": "none",
      "preconditions": "Resolve webhook before confirmation.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WebhookDeleteResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "webhook.get",
      "command_path": "webhook get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Redact secret.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WebhookGetResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWebhookDetails",
      "pagination_policy": "none",
      "preconditions": "Redact secret.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WebhookGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "webhook.list",
      "command_path": "webhook list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "offset"
        },
        "preconditions": "Current SDK discards pagination metadata.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WebhookListResult",
        "scope": "profile",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/webhooks",
      "limits": {
        "continuation": "not_proven",
        "pagination": "offset"
      },
      "mutation_class": "read",
      "operation_id": "ListWebhooks",
      "pagination_policy": "offset",
      "preconditions": "Current SDK discards pagination metadata.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WebhookListResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "webhook.send",
      "command_path": "webhook send",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Delivers a payload to the webhook, which ingests it into its dataset. Never retry a send: each call adds data. Check `webhook get` first.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookSendResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /webhooks/data/{webhook_uri}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddDataToWebhook",
      "pagination_policy": "none",
      "preconditions": "Delivers a payload to the webhook, which ingests it into its dataset. Never retry a send: each call adds data. Check `webhook get` first.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WebhookSendResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.send_data",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "webhook.send-get",
      "command_path": "webhook send-get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "webhook send-get is a mutation despite HTTP GET, and it is never retried. Reject an empty query; never log the URI if the server treats it as a capability.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookSendGetResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "GET /webhooks/data/{webhook_uri}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddDataToWebhookUsingGetMethod",
      "pagination_policy": "none",
      "preconditions": "webhook send-get is a mutation despite HTTP GET, and it is never retried. Reject an empty query; never log the URI if the server treats it as a capability.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WebhookSendGetResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.send_data_get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "webhook.update",
      "command_path": "webhook update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Reject an empty patch; a newly issued secret uses the secret-output rule.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WebhookUpdateResult",
        "scope": "profile",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/webhooks/{webhook_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateWebhookConfigurations",
      "pagination_policy": "none",
      "preconditions": "Reject an empty patch; a newly issued secret uses the secret-output rule.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WebhookUpdateResult",
      "scope": "profile",
      "sdk_symbol": "mammoth.api.webhooks.WebhooksAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workflow.archive",
      "command_path": "workflow archive",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {archived: true|false, dataset_ids?: [int]}. The dataset ids are the workflow's datasets now; it reads as active once it has others.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowArchiveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PUT /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/archived",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SetArchived",
      "pagination_policy": "none",
      "preconditions": "Input: {archived: true|false, dataset_ids?: [int]}. The dataset ids are the workflow's datasets now; it reads as active once it has others.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowArchiveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.set_archived",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workflow.attach-dataset",
      "command_path": "workflow attach-dataset",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Takes the dataset to attach as the second positional, DATASOURCE_ID. No input document.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowAttachDatasetResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/datasets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AttachDataset",
      "pagination_policy": "none",
      "preconditions": "Takes the dataset to attach as the second positional, DATASOURCE_ID. No input document.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowAttachDatasetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.attach_dataset",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.block.add",
      "command_path": "workflow block add",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockAddResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddSkeletonBlock",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowBlockAddResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_add",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.block.auth",
      "command_path": "workflow block auth",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockAuthResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/auth",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PatchBlockAuth",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowBlockAuthResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_auth",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.block.config",
      "command_path": "workflow block config",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockConfigResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/config",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PromoteSkeletonBlock",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowBlockConfigResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_config",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.block.type",
      "command_path": "workflow block type",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowBlockTypeResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/blocks/{block_id}/type",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "PatchBlockType",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID, BLOCK_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowBlockTypeResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.block_type",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.canvas",
      "command_path": "workflow canvas",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Proposes changes to a workflow for the user to review and Save on the Workflows canvas; nothing is built until they Save, and Save builds every change in flow order. Use it when the user asks to suggest, sketch or draft a workflow, or wants to review first. Steps inside a view are changes too: propose the filters, calculations and other tasks a proposed or existing view needs as add_step changes in the same call, never as view commands run afterwards. WORKFLOW_ID is the workflow's record id (URL id w12 is record 12); an unnamed workflow has none, so name it first with workflow create --seed_datasource_id. Input: {\"canvas_state\": {\"proposed_changes\": [...]}}, each change one of (integer ids from workflow graph): {op: add_view, dataset_id, name, ref?}; {op: rename_view, dataset_id, view_id, name}; {op: trash_view, dataset_id, view_id}; {op: rename_dataset, dataset_id, name}; {op: trash_dataset, dataset_id}; {op: send_to_new_dataset, dataset_id, view_id, name, ref?}; {op: send_to_dataset, dataset_id, view_id, target_dataset_id}; {op: join, dataset_id, view_id, with_dataset_id, with_view_id, join_type?, on?, select?, column_prefix?} (with join_type INNER|LEFT|RIGHT|OUTER, on [{left, right}] and select [columns], Save builds the join); {op: export, dataset_id, view_id, connector?, destination?, connection_id?, settings?} (an existing connection and the destination's settings, never a credential); {op: add_source, name, dataset_name, ref?, kind?, url?, connector?, connection_id?, settings?} (kind url with a link, or connection with an existing connection; with neither it waits for the user's data); {op: lookup, view_id, lookup_view_id, key, source, value, new_column?, label?, ref?}; {op: add_step, view_id, transform, params, label, after_ref?, ref?} (transform is a view transform kind such as filter, discard-duplicates or sort, and params is exactly that command's --input: schema get view.transform.<kind>; after_ref names an earlier add_step on the same view); {op: update_step, view_id, task_id, params, label?}; {op: remove_step, view_id, task_id}. A later change in the same call can point at something an earlier one proposes: give the earlier change a ref, then use view_ref, dataset_ref or target_dataset_ref in place of the id (an add_step on a proposed view uses view_ref) (a new dataset's ref also names its first view), so a whole shape is proposed in one call. A step is checked when proposed; a refused one says how to fix it. Join, export and complex steps (join, lookup, ai, add-sql, generate-sql, pivot, crosstab, window, unnest) arrive needing setup in the Data Editor. Tell the user the changes wait on the canvas for their review.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCanvasResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/canvas",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateCanvasState",
      "pagination_policy": "none",
      "preconditions": "Proposes changes to a workflow for the user to review and Save on the Workflows canvas; nothing is built until they Save, and Save builds every change in flow order. Use it when the user asks to suggest, sketch or draft a workflow, or wants to review first. Steps inside a view are changes too: propose the filters, calculations and other tasks a proposed or existing view needs as add_step changes in the same call, never as view commands run afterwards. WORKFLOW_ID is the workflow's record id (URL id w12 is record 12); an unnamed workflow has none, so name it first with workflow create --seed_datasource_id. Input: {\"canvas_state\": {\"proposed_changes\": [...]}}, each change one of (integer ids from workflow graph): {op: add_view, dataset_id, name, ref?}; {op: rename_view, dataset_id, view_id, name}; {op: trash_view, dataset_id, view_id}; {op: rename_dataset, dataset_id, name}; {op: trash_dataset, dataset_id}; {op: send_to_new_dataset, dataset_id, view_id, name, ref?}; {op: send_to_dataset, dataset_id, view_id, target_dataset_id}; {op: join, dataset_id, view_id, with_dataset_id, with_view_id, join_type?, on?, select?, column_prefix?} (with join_type INNER|LEFT|RIGHT|OUTER, on [{left, right}] and select [columns], Save builds the join); {op: export, dataset_id, view_id, connector?, destination?, connection_id?, settings?} (an existing connection and the destination's settings, never a credential); {op: add_source, name, dataset_name, ref?, kind?, url?, connector?, connection_id?, settings?} (kind url with a link, or connection with an existing connection; with neither it waits for the user's data); {op: lookup, view_id, lookup_view_id, key, source, value, new_column?, label?, ref?}; {op: add_step, view_id, transform, params, label, after_ref?, ref?} (transform is a view transform kind such as filter, discard-duplicates or sort, and params is exactly that command's --input: schema get view.transform.<kind>; after_ref names an earlier add_step on the same view); {op: update_step, view_id, task_id, params, label?}; {op: remove_step, view_id, task_id}. A later change in the same call can point at something an earlier one proposes: give the earlier change a ref, then use view_ref, dataset_ref or target_dataset_ref in place of the id (an add_step on a proposed view uses view_ref) (a new dataset's ref also names its first view), so a whole shape is proposed in one call. A step is checked when proposed; a refused one says how to fix it. Join, export and complex steps (join, lookup, ai, add-sql, generate-sql, pivot, crosstab, window, unnest) arrive needing setup in the Data Editor. Tell the user the changes wait on the canvas for their review.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowCanvasResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.canvas",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.cleanup",
      "command_path": "workflow cleanup",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes the active project's ghost (orphaned, half-created) workflows for good; real workflows are untouched. Needs --project or an active project, and a prompt or --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCleanupResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/cleanup",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "CleanupGhostWorkflows",
      "pagination_policy": "none",
      "preconditions": "Deletes the active project's ghost (orphaned, half-created) workflows for good; real workflows are untouched. Needs --project or an active project, and a prompt or --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowCleanupResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.cleanup",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.create",
      "command_path": "workflow create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "With seed_datasource_id set to a workflow's root dataset id (workflow graph lists each workflow's datasets), names that existing unnamed workflow and returns its record id; without it, starts a new empty workflow.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowCreateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateWorkflow",
      "pagination_policy": "none",
      "preconditions": "With seed_datasource_id set to a workflow's root dataset id (workflow graph lists each workflow's datasets), names that existing unnamed workflow and returns its record id; without it, starts a new empty workflow.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowCreateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.delete",
      "command_path": "workflow delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowDeleteResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "DeleteWorkflow",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowDeleteResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "always_wait",
      "canonical_command": "workflow.duplicate",
      "command_path": "workflow duplicate",
      "confirmation": "none",
      "contract": {
        "async": "always_wait",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Copies the chosen datasets, with their rows, views and steps, into a new workflow. Automations and outside exports are not copied.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowDuplicateResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/duplicate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "DuplicateWorkflow",
      "pagination_policy": "none",
      "preconditions": "Copies the chosen datasets, with their rows, views and steps, into a new workflow. Automations and outside exports are not copied.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowDuplicateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.duplicate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.from-template",
      "command_path": "workflow from-template",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: TEMPLATE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowFromTemplateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/from-template",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "InstantiateFromTemplate",
      "pagination_policy": "none",
      "preconditions": "Required inputs: TEMPLATE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowFromTemplateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.from_template",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.get",
      "command_path": "workflow get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: WORKFLOW_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkflow",
      "pagination_policy": "none",
      "preconditions": "Required inputs: WORKFLOW_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowGetResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.graph",
      "command_path": "workflow graph",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowGraphResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/graph",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetProjectWorkflowGraph",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowGraphResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.graph",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.list",
      "command_path": "workflow list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkflows",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowListResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workflow.resolve-held",
      "command_path": "workflow resolve-held",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Takes the change's key as the second positional, KEY. Input: {built: true|false (true: already in Mammoth, not built again; false: lift the hold so the next Save builds it), expected_version?: int}.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowResolveHeldResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/held/resolve",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "ResolveHeldChange",
      "pagination_policy": "none",
      "preconditions": "Takes the change's key as the second positional, KEY. Input: {built: true|false (true: already in Mammoth, not built again; false: lift the hold so the next Save builds it), expected_version?: int}.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowResolveHeldResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.resolve_held",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workflow.save",
      "command_path": "workflow save",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input (optional): {keys?: [change keys to save], expected_version?: int}. Omitted keys save every unsaved change; a stale expected_version fails with 409.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "SaveWorkflow",
      "pagination_policy": "none",
      "preconditions": "Input (optional): {keys?: [change keys to save], expected_version?: int}. Omitted keys save every unsaved change; a stale expected_version fails with 409.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowSaveResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.save",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workflow.save-cancel-step",
      "command_path": "workflow save-cancel-step",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Cancels one step of a running Save; steps that need it are skipped. Best effort: a job already started may still finish.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveCancelStepResult",
        "scope": "project",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save/{run_id}/steps/{step}/cancel",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CancelWorkflowSaveStep",
      "pagination_policy": "none",
      "preconditions": "Cancels one step of a running Save; steps that need it are skipped. Best effort: a job already started may still finish.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowSaveCancelStepResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.cancel_save_step",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "always_wait",
      "canonical_command": "workflow.save-undo",
      "command_path": "workflow save-undo",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "always_wait",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes what the Save built (datasets, views, steps). Prompts, or pass --yes. Waits for the undo run.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowSaveUndoResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "POST /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}/save/{run_id}/undo",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "UndoWorkflowSave",
      "pagination_policy": "none",
      "preconditions": "Removes what the Save built (datasets, views, steps). Prompts, or pass --yes. Waits for the undo run.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowSaveUndoResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.undo_save",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "always_wait"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.build",
      "command_path": "workflow template build",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {inputs, matches, destination_name, settings?, destination_emails?} as in workflow template preview; the server refuses a build whose own preview could not run. Answers while the Save runs: follow it with workflow get WORKFLOW_ID (canvas_state.save_run).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkflowTemplateBuildResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Input: {inputs, matches, destination_name, settings?, destination_emails?} as in workflow template preview; the server refuses a build whose own preview could not run. Answers while the Save runs: follow it with workflow get WORKFLOW_ID (canvas_state.save_run).",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkflowTemplateBuildResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.fit",
      "command_path": "workflow template fit",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}}. Read-only; the matches it proposes go into the preview and build inputs.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateFitResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}}. Read-only; the matches it proposes go into the preview and build inputs.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplateFitResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.get",
      "command_path": "workflow template get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only: the inputs, roles and settings the other template commands take.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateGetResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Read-only: the inputs, roles and settings the other template commands take.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplateGetResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.list",
      "command_path": "workflow template list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists the project workflow-template catalog (ready-made reconciliations and reports), not the workspace templates of 'template list'. Pick a key, then run workflow template get KEY.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateListResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Lists the project workflow-template catalog (ready-made reconciliations and reports), not the workspace templates of 'template list'. Pick a key, then run workflow template get KEY.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplateListResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.preview",
      "command_path": "workflow template preview",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}, matches: {INPUT_KEY: {ROLE_KEY: {column: NAME}}}, settings?: {}}. Read-only: runs the template on the first rows of your tables.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplatePreviewResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Input: {inputs: {INPUT_KEY: DATASET_ID}, matches: {INPUT_KEY: {ROLE_KEY: {column: NAME}}}, settings?: {}}. Read-only: runs the template on the first rows of your tables.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplatePreviewResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.rank",
      "command_path": "workflow template rank",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Input: {input_key: INPUT_KEY, dataset_ids: [1 to 200 dataset ids]}. Judges each table from its column names and types alone, so it reads no rows.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateRankResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Input: {input_key: INPUT_KEY, dataset_ids: [1 to 200 dataset ids]}. Judges each table from its column names and types alone, so it reads no rows.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplateRankResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.sample-result",
      "command_path": "workflow template sample-result",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Computed in memory on the template's own sample rows; nothing is imported.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowTemplateSampleResultResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Computed in memory on the template's own sample rows; nothing is imported.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowTemplateSampleResultResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workflow.template.samples",
      "command_path": "workflow template samples",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Imports the template's sample tables into the project, once, so the template can be tried without your own data.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkflowTemplateSamplesResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Imports the template's sample tables into the project, once, so the template can be tried without your own data.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkflowTemplateSamplesResult",
      "scope": "project",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_disposable_project",
      "async": "not_async",
      "canonical_command": "workflow.update",
      "command_path": "workflow update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "WORKFLOW_ID is the workflow's record id: URL id w12 is record 12. An unnamed workflow (base64 URL id) has no record; name it with workflow create --seed_datasource_id <its root dataset id> instead.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkflowUpdateResult",
        "scope": "project",
        "verification": "live_disposable_project"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/projects/{project_id}/workflows/{workflow_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateWorkflow",
      "pagination_policy": "none",
      "preconditions": "WORKFLOW_ID is the workflow's record id: URL id w12 is record 12. An unnamed workflow (base64 URL id) has no record; name it with workflow create --seed_datasource_id <its root dataset id> instead.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkflowUpdateResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_disposable_project",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.workspace-datasets",
      "command_path": "workflow workspace-datasets",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceDatasetsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-datasets",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceDatasets",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowWorkspaceDatasetsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_datasets",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.workspace-exports",
      "command_path": "workflow workspace-exports",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceExportsResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-exports",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceExports",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowWorkspaceExportsResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_exports",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workflow.workspace-sources",
      "command_path": "workflow workspace-sources",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkflowWorkspaceSourcesResult",
        "scope": "project",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/workflows/workspace-sources",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListWorkspaceSources",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkflowWorkspaceSourcesResult",
      "scope": "project",
      "sdk_symbol": "mammoth.api.workflows.WorkflowsAPI.workspace_sources",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.accept-invite",
      "command_path": "workspace accept-invite",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceAcceptInviteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /accept-invite",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AcceptInvite",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceAcceptInviteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.accept_invite",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.app-usage",
      "command_path": "workspace app-usage",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceAppUsageResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/app-usage",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetAppUsage",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceAppUsageResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.app_usage",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.check-expression",
      "command_path": "workspace check-expression",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceCheckExpressionResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/ai/check-expression",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "GenerateCheckExpression",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceCheckExpressionResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.check_expression",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.create",
      "command_path": "workspace create",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "CreateWorkspace",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workspace.current",
      "command_path": "workspace current",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The workspace this token acts in, and the server (resource) and project it is fenced to.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceCurrentResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/current",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetCurrentWorkspace",
      "pagination_policy": "none",
      "preconditions": "Read-only. The workspace this token acts in, and the server (resource) and project it is fenced to.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceCurrentResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.current",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.delete",
      "command_path": "workspace delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact immutable workspace-ID confirmation, not --yes alone.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteUserWorkspace",
      "pagination_policy": "none",
      "preconditions": "Exact immutable workspace-ID confirmation, not --yes alone.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.export-hosts.get",
      "command_path": "workspace export-hosts get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceExportHostsGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/export-hosts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "Read",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceExportHostsGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.export_hosts",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.export-hosts.set",
      "command_path": "workspace export-hosts set",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sets which hosts exports may send data to for the whole workspace. Admins only. Needs --yes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceExportHostsSetResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PUT /workspaces/{workspace_id}/export-hosts",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "Update",
      "pagination_policy": "none",
      "preconditions": "Sets which hosts exports may send data to for the whole workspace. Admins only. Needs --yes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceExportHostsSetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.exports.ExportsAPI.set_export_hosts",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.get",
      "command_path": "workspace get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspace",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceGetResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.get",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.home",
      "command_path": "workspace home",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "The Home read: usage_summary (storage, plan), health_issues (type, severity, occurrence_count, available_actions) and suggestions. Read-only; not a chat turn.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceHomeResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/home",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetHomeSummary",
      "pagination_policy": "none",
      "preconditions": "The Home read: usage_summary (storage, plan), health_issues (type, severity, occurrence_count, available_actions) and suggestions. Read-only; not a chat turn.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceHomeResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.home_summary",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.invite.delete",
      "command_path": "workspace invite delete",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Deletes pending invites for good and frees their seats. Take invite_ids from workspace invite list (a pending invite is not a workspace user; workspace user list never shows it).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Deletes pending invites for good and frees their seats. Take invite_ids from workspace invite list (a pending invite is not a workspace user; workspace user list never shows it).",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkspaceInviteDeleteResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.invite.list",
      "command_path": "workspace invite list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Lists pending invites with id, email, status, role and invited_at. Optional project_id keeps invites that grant a role on that project.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceInviteListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Lists pending invites with id, email, status, role and invited_at. Optional project_id keeps invites that grant a role on that project.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceInviteListResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.invite.resend",
      "command_path": "workspace invite resend",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Sends the invitation email again. Take invite_ids from workspace invite list.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteResendResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Sends the invitation email again. Take invite_ids from workspace invite list.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkspaceInviteResendResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.invite.revoke",
      "command_path": "workspace invite revoke",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Marks pending invites revoked; the row stays. To remove an invite for good use workspace invite delete.",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteRevokeResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Marks pending invites revoked; the row stays. To remove an invite for good use workspace invite delete.",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkspaceInviteRevokeResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.invite.update-role",
      "command_path": "workspace invite update-role",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes the workspace role a pending invite will grant (workspace_member, workspace_admin, workspace_owner, workspace_guest).",
        "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
        "result": "WorkspaceInviteUpdateRoleResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Changes the workspace role a pending invite will grant (workspace_member, workspace_admin, workspace_owner, workspace_guest).",
      "recovery": "Reconcile target/job state before retry; retain returned IDs and verify the intended postcondition.",
      "result": "WorkspaceInviteUpdateRoleResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.list",
      "command_path": "workspace list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetWorkspaces",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.llm-task",
      "command_path": "workspace llm-task",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceLlmTaskResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/llm",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "RunLlmTask",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceLlmTaskResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.llm_task",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.oauth-client.create",
      "command_path": "workspace oauth-client create",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Registers an OAuth client that can sign users in. A confidential client's client_secret is returned exactly once and shown once in this output; store it now, it cannot be fetched again. Send name and redirect_uris through --input.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientCreateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/oauth-clients",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "CreateOauthClient",
      "pagination_policy": "none",
      "preconditions": "Registers an OAuth client that can sign users in. A confidential client's client_secret is returned exactly once and shown once in this output; store it now, it cannot be fetched again. Send name and redirect_uris through --input.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceOauthClientCreateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.create",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.oauth-client.delete",
      "command_path": "workspace oauth-client delete",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Deleting the client stops its grants working.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientDeleteResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/oauth-clients/{oauth_client_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "DeleteOauthClient",
      "pagination_policy": "none",
      "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Deleting the client stops its grants working.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceOauthClientDeleteResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.delete",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_no_disposable_fixture",
      "async": "not_async",
      "canonical_command": "workspace.oauth-client.list",
      "command_path": "workspace oauth-client list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Read-only. The workspace's OAuth clients (id, client_id, name, redirect URIs). No client secret is returned.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "AuthOauthClientListResult",
        "scope": "workspace",
        "verification": "contract_only_no_disposable_fixture"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/oauth-clients",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "ListOauthClients",
      "pagination_policy": "none",
      "preconditions": "Read-only. The workspace's OAuth clients (id, client_id, name, redirect URIs). No client secret is returned.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "AuthOauthClientListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_no_disposable_fixture",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.oauth-client.revoke-grant",
      "command_path": "workspace oauth-client revoke-grant",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Every user who authorised this client must authorise it again.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceOauthClientRevokeGrantResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "DELETE /workspaces/{workspace_id}/oauth-clients/{oauth_client_id}/grant",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "RevokeOauthGrant",
      "pagination_policy": "none",
      "preconditions": "Exact OAuth client ID confirmation (--yes --confirm ID). Every user who authorised this client must authorise it again.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceOauthClientRevokeGrantResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.oauth_clients.OAuthClientsAPI.revoke_grant",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.reactivate",
      "command_path": "workspace reactivate",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Turns a deactivated workspace back on; its users regain access and billing resumes. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceReactivateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "POST /workspaces/{workspace_id}/reactivate",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "ReactivateWorkspace",
      "pagination_policy": "none",
      "preconditions": "Turns a deactivated workspace back on; its users regain access and billing resumes. Needs --yes and --confirm WORKSPACE_ID (the refusal prints it).",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceReactivateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.reactivate",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.segment.list",
      "command_path": "workspace segment list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": null,
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceSegmentListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/split-segments",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetSegments",
      "pagination_policy": "single_page",
      "preconditions": null,
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceSegmentListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.segment_list",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.segment.update",
      "command_path": "workspace segment update",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceSegmentUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "PATCH /workspaces/{workspace_id}/split-segments",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "UpdateSegments",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceSegmentUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.segment_update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.storage-breakdown",
      "command_path": "workspace storage-breakdown",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "This is a paginated per-item list of storage-consuming resources (limit/offset); it carries no workspace total and can page through thousands of items. For the workspace's total storage used/allowed, use `workspace app-usage` instead.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceStorageBreakdownResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/storage-breakdown",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": "GetStorageBreakdown",
      "pagination_policy": "none",
      "preconditions": "This is a paginated per-item list of storage-consuming resources (limit/offset); it carries no workspace total and can page through thousands of items. For the workspace's total storage used/allowed, use `workspace app-usage` instead.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceStorageBreakdownResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.storage_breakdown",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.update",
      "command_path": "workspace update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Patches workspace settings that apply to every member. Read them first (`workspace get`). Needs --yes and --confirm WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateWorkspace",
      "pagination_policy": "none",
      "preconditions": "Patches workspace settings that apply to every member. Read them first (`workspace get`). Needs --yes and --confirm WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.update",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.user.add",
      "command_path": "workspace user add",
      "confirmation": "yes_always",
      "contract": {
        "async": "not_async",
        "effects": "benign_mutation",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": null,
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserAddResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "benign_mutation",
      "identity": "POST /workspaces/{workspace_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "benign_mutation",
      "operation_id": "AddUserInWorkspace",
      "pagination_policy": "none",
      "preconditions": null,
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUserAddResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_add",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "async": "not_async",
      "canonical_command": "workspace.user.get",
      "command_path": "workspace user get",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceUserGetResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": null,
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "read",
      "operation_id": null,
      "pagination_policy": "none",
      "preconditions": "Required inputs: USER_ID.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceUserGetResult",
      "scope": "workspace",
      "sdk_symbol": null,
      "source": "schema list",
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "live_read_only",
      "async": "not_async",
      "canonical_command": "workspace.user.list",
      "command_path": "workspace user list",
      "confirmation": "none",
      "contract": {
        "async": "not_async",
        "effects": "read",
        "limits": {
          "continuation": "not_proven",
          "pagination": "single_page"
        },
        "preconditions": "Lists members only; a pending invite is not a member. For pending invites and their ids run workspace invite list. Optional project_id keeps one project's members.",
        "recovery": "Rerun only after checking the exit code and stable error code.",
        "result": "WorkspaceUserListResult",
        "scope": "workspace",
        "verification": "live_read_only"
      },
      "disposition": "command",
      "effects": "read",
      "identity": "GET /workspaces/{workspace_id}/users",
      "limits": {
        "continuation": "not_proven",
        "pagination": "single_page"
      },
      "mutation_class": "read",
      "operation_id": "GetUsersInWorkspace",
      "pagination_policy": "single_page",
      "preconditions": "Lists members only; a pending invite is not a member. For pending invites and their ids run workspace invite list. Optional project_id keeps one project's members.",
      "recovery": "Rerun only after checking the exit code and stable error code.",
      "result": "WorkspaceUserListResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.list_users",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "live_read_only",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.user.remove",
      "command_path": "workspace user remove",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Required inputs: USER_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserRemoveResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/users/{user_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "RemoveUser",
      "pagination_policy": "none",
      "preconditions": "Required inputs: USER_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUserRemoveResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_remove",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.user.remove-batch",
      "command_path": "workspace user remove-batch",
      "confirmation": "prompt_or_yes",
      "contract": {
        "async": "not_async",
        "effects": "destructive",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Removes members (ids) and/or pending invites (invite_ids). Take invite ids from workspace invite list; workspace invite delete is the dedicated command for invites.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserRemoveBatchResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "destructive",
      "identity": "DELETE /workspaces/{workspace_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "destructive",
      "operation_id": "RemoveUserFromWorkspace",
      "pagination_policy": "none",
      "preconditions": "Removes members (ids) and/or pending invites (invite_ids). Take invite ids from workspace invite list; workspace invite delete is the dedicated command for invites.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUserRemoveBatchResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_remove_batch",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.user.update",
      "command_path": "workspace user update",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Exact user-ID confirmation for owner/admin role changes.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserUpdateResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/users/{user_id}",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateUserInWorkspace",
      "pagination_policy": "none",
      "preconditions": "Exact user-ID confirmation for owner/admin role changes.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUserUpdateResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspace.WorkspaceAPI.update_user",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": "contract_only_high_impact",
      "async": "not_async",
      "canonical_command": "workspace.user.update-batch",
      "command_path": "workspace user update-batch",
      "confirmation": "confirm_target",
      "contract": {
        "async": "not_async",
        "effects": "high_impact",
        "limits": {
          "continuation": null,
          "pagination": "none"
        },
        "preconditions": "Changes the roles of several workspace users in one JSON-patch call; each gains or loses access at once. Read `workspace user list` first. Needs --yes and --confirm WORKSPACE_ID.",
        "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
        "result": "WorkspaceUserUpdateBatchResult",
        "scope": "workspace",
        "verification": "contract_only_high_impact"
      },
      "disposition": "command",
      "effects": "high_impact",
      "identity": "PATCH /workspaces/{workspace_id}/users",
      "limits": {
        "continuation": null,
        "pagination": "none"
      },
      "mutation_class": "high_impact",
      "operation_id": "UpdateUserToWorkspace",
      "pagination_policy": "none",
      "preconditions": "Changes the roles of several workspace users in one JSON-patch call; each gains or loses access at once. Read `workspace user list` first. Needs --yes and --confirm WORKSPACE_ID.",
      "recovery": "Reconcile target/job state before retry; retain IDs and verify the postcondition.",
      "result": "WorkspaceUserUpdateBatchResult",
      "scope": "workspace",
      "sdk_symbol": "mammoth.api.workspaces.WorkspacesAPI.user_update_batch",
      "server_status": "served",
      "source": "capability list",
      "unavailable": false,
      "verification": "contract_only_high_impact",
      "wait_policy": "not_async"
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/notify-job",
      "mutation_class": null,
      "operation_id": "AgentNotifyJob",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /oauth/device-approve",
      "mutation_class": null,
      "operation_id": "ApproveDevice",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /oauth/consent",
      "mutation_class": null,
      "operation_id": "Authorize",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /oauth/authorize",
      "mutation_class": null,
      "operation_id": "AuthorizeRedirect",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /collections/reach",
      "mutation_class": null,
      "operation_id": "CollectionsReach",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /workspaces/{workspace_id}/mm-ue",
      "mutation_class": null,
      "operation_id": "Create",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/public/gallery",
      "mutation_class": null,
      "operation_id": "DashboardPublicGallery",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "HEAD /dashboards/public/gallery",
      "mutation_class": null,
      "operation_id": "DashboardPublicGalleryHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/public/gallery/sitemap.xml",
      "mutation_class": null,
      "operation_id": "DashboardPublicGallerySitemap",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "HEAD /dashboards/public/gallery/sitemap.xml",
      "mutation_class": null,
      "operation_id": "DashboardPublicGallerySitemapHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/public/gallery/{slug}",
      "mutation_class": null,
      "operation_id": "DashboardPublicGalleryTemplate",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "HEAD /dashboards/public/gallery/{slug}",
      "mutation_class": null,
      "operation_id": "DashboardPublicGalleryTemplateHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "HEAD /dashboards/public/templates/{slug}",
      "mutation_class": null,
      "operation_id": "DashboardPublicTemplateHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/public/templates/{slug}/thumbnail",
      "mutation_class": null,
      "operation_id": "DashboardPublicTemplateThumbnail",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "HEAD /dashboards/public/templates",
      "mutation_class": null,
      "operation_id": "DashboardPublicTemplatesHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /gdpr_hooks/{integration_name}/deauthorization",
      "mutation_class": null,
      "operation_id": "DeleteUserData",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /oauth/consent/deny",
      "mutation_class": null,
      "operation_id": "Deny",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /oauth/device-deny",
      "mutation_class": null,
      "operation_id": "DenyDevice",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/needs-you/dismiss",
      "mutation_class": null,
      "operation_id": "DismissAgentNeed",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/briefing",
      "mutation_class": null,
      "operation_id": "GetAgentBriefing",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/documents/{sha}",
      "mutation_class": null,
      "operation_id": "GetAgentChatDocument",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/documents/{sha}/pages/{page}",
      "mutation_class": null,
      "operation_id": "GetAgentChatDocumentPage",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/images/{sha}",
      "mutation_class": null,
      "operation_id": "GetAgentChatImage",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/{dashboard_id}/chat/attachments/{sha}",
      "mutation_class": null,
      "operation_id": "GetChatAttachment",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /oauth/consent-info",
      "mutation_class": null,
      "operation_id": "GetConsentInfo",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /oauth/device-info",
      "mutation_class": null,
      "operation_id": "GetDeviceInfo",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /dashboards/{dashboard_id}/head",
      "mutation_class": null,
      "operation_id": "GetDraftHead",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "alias",
      "identity": "GET /workspaces/{workspace_id}/subscription_v1/invoices/{invoice_id}",
      "mutation_class": null,
      "operation_id": "GetInvoice",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /subscription/stripe/webhook",
      "mutation_class": null,
      "operation_id": "HandleStripeWebhook",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "GET /health",
      "mutation_class": null,
      "operation_id": "HealthCheck",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/needs-you",
      "mutation_class": null,
      "operation_id": "ListAgentNeedsYou",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "alias",
      "identity": "GET /workspaces/{workspace_id}/subscription_v1/invoices",
      "mutation_class": null,
      "operation_id": "ListInvoices",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/seen",
      "mutation_class": null,
      "operation_id": "MarkAgentSessionSeen",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/ai/connector-chat/oauth-callback",
      "mutation_class": null,
      "operation_id": "OauthCallback",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /dashboards/{dashboard_id}/presence",
      "mutation_class": null,
      "operation_id": "PostPresence",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/chart-placements",
      "mutation_class": null,
      "operation_id": "RecordAgentChartPlacement",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/chip-feedback",
      "mutation_class": null,
      "operation_id": "RecordAgentChipFeedback",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /workspaces/{workspace_id}/projects/{project_id}/events/resources/stream",
      "mutation_class": null,
      "operation_id": "ResourceEventsStream",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /gdpr_hooks/shopify/customers/redact",
      "mutation_class": null,
      "operation_id": "ShopifyCustomerRedact",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /gdpr_hooks/shopify/customers/data_request",
      "mutation_class": null,
      "operation_id": "ShopifyDataRequest",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /gdpr_hooks/shopify/shop/redact",
      "mutation_class": null,
      "operation_id": "ShopifyShopRedact",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /tool-claims",
      "mutation_class": null,
      "operation_id": "StartToolClaim",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /jobs/{job_id}/stream",
      "mutation_class": null,
      "operation_id": "StreamJob",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/sessions/{session_id}/credential-test",
      "mutation_class": null,
      "operation_id": "TestAgentCredentialCard",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /dashboards/{dashboard_id}/track-action",
      "mutation_class": null,
      "operation_id": "TrackAction",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /dashboards/url/{url}/track-heartbeat",
      "mutation_class": null,
      "operation_id": "TrackHeartbeat",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "POST /dashboards/url/{url}/track-view",
      "mutation_class": null,
      "operation_id": "TrackView",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "protocol_only",
      "identity": "GET /unsubscribe",
      "mutation_class": null,
      "operation_id": "UnsubscribeMessaging",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/documents",
      "mutation_class": null,
      "operation_id": "UploadAgentChatDocument",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "POST /agents/images",
      "mutation_class": null,
      "operation_id": "UploadAgentChatImage",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    },
    {
      "acceptance_evidence": null,
      "canonical_command": null,
      "command_path": null,
      "confirmation": null,
      "contract": null,
      "disposition": "internal_only",
      "identity": "GET /agents/sessions/{session_id}/turns/{turn_id}/events",
      "mutation_class": null,
      "operation_id": "WatchAgentTurn",
      "pagination_policy": null,
      "sdk_symbol": null,
      "server_status": null,
      "source": "capability list",
      "unavailable": false,
      "wait_policy": null
    }
  ]
}
